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 utility functions used 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * by SMP. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #if SMP_DEBUG == TRUE 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include <stdio.h> 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #endif 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include <string.h> 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btm_ble_api.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "smp_int.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btm_int.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "btm_ble_int.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "hcimsgs.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "aes.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #ifndef SMP_MAX_ENC_REPEAT 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #define SMP_MAX_ENC_REPEAT 3 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #endif 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_rand_back(tBTM_RAND_ENC *p); 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_genenrate_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_genenrate_ltk_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_y(tSMP_CB *p_cb, tSMP_INT_DATA *p); 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p); 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_stk(tSMP_CB *p_cb, tSMP_ENC *p); 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_calculate_comfirm_cont(tSMP_CB *p_cb, tSMP_ENC *p); 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_confirm(tSMP_CB *p_cb, tSMP_ENC *p); 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_compare(tSMP_CB *p_cb, tSMP_ENC *p); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_ediv(tSMP_CB *p_cb, tSMP_ENC *p); 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tSMP_ACT smp_encrypt_action[] = 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_compare, /* SMP_GEN_COMPARE */ 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_genenrate_confirm, /* SMP_GEN_CONFIRM*/ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_stk, /* SMP_GEN_STK*/ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_genenrate_ltk_cont, /* SMP_GEN_LTK */ 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_ltk, /* SMP_GEN_DIV_LTK */ 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_rand_vector, /* SMP_GEN_RAND_V */ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_y, /* SMP_GEN_EDIV */ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_passkey, /* SMP_GEN_TK */ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_confirm, /* SMP_GEN_SRAND_MRAND */ 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_genenrate_rand_cont /* SMP_GEN_SRAND_MRAND_CONT */ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #define SMP_PASSKEY_MASK 0xfff00000 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #if SMP_DEBUG == TRUE 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_debug_print_nbyte_little_endian (UINT8 *p, const UINT8 *key_name, UINT8 len) 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i, x = 0; 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 p_buf[100]; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_buf, 0, 100); 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < len; i ++) 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project x += sprintf ((char *)&p_buf[x], "%02x ", p[i]); 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_WARNING2("%s(LSB ~ MSB) = %s", key_name, p_buf); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #else 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #define smp_debug_print_nbyte_little_endian(p, key_name, len) 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #endif 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_encrypt_data 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate passkey. 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len, 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *plain_text, UINT8 pt_len, 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC *p_out) 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project aes_context ctx; 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_start = NULL; 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = NULL; 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_rev_data = NULL; /* input data in big endilan format */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_rev_key = NULL; /* input key in big endilan format */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_rev_output = NULL; /* encrypted output in big endilan format */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_encrypt_data"); 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) ) 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0 ("smp_encrypt_data Failed"); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_start = (UINT8 *)GKI_getbuf((SMP_ENCRYT_DATA_SIZE*4))) == NULL) 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_ERROR0 ("smp_encrypt_data Failed unable to allocate buffer"); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(FALSE); 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pt_len > SMP_ENCRYT_DATA_SIZE) 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pt_len = SMP_ENCRYT_DATA_SIZE; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_start, 0, SMP_ENCRYT_DATA_SIZE * 4); 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_start; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, plain_text, pt_len); /* byte 0 to byte 15 */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_data = p = p_start + SMP_ENCRYT_DATA_SIZE; /* start at byte 16 */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, p_start, SMP_ENCRYT_DATA_SIZE); /* byte 16 to byte 31 */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_key = p; /* start at byte 32 */ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, key, SMP_ENCRYT_KEY_SIZE); /* byte 32 to byte 47 */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(key, (const UINT8 *)"Key", SMP_ENCRYT_KEY_SIZE); 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p_start, (const UINT8 *)"Plain text", SMP_ENCRYT_DATA_SIZE); 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_output = p; 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project aes_set_key(p_rev_key, SMP_ENCRYT_KEY_SIZE, &ctx); 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project aes_encrypt(p_rev_data, p, &ctx); /* outputs in byte 48 to byte 63 */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_out->param_buf; 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, p_rev_output, SMP_ENCRYT_DATA_SIZE); 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p_out->param_buf, (const UINT8 *)"Encrypted text", SMP_ENCRYT_KEY_SIZE); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->param_len = SMP_ENCRYT_KEY_SIZE; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->status = HCI_SUCCESS; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->opcode = HCI_BLE_ENCRYPT; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_start); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return(TRUE); 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_passkey 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate passkey. 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_passkey(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_passkey"); 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_TK; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_proc_passkey 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process a passkey. 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_passkey(tSMP_CB *p_cb , tBTM_RAND_ENC *p) 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *tt = p_cb->tk; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 passkey; //= 19655 test number; */ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp = p->param_buf; 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_proc_passkey "); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32(passkey, pp); 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey &= ~SMP_PASSKEY_MASK; 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* truncate by maximum value */ 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (passkey > BTM_MAX_PASSKEY_VAL) 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey >>= 1; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR1("Passkey generated = %d", passkey); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the TK */ 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_cb->tk, 0, BT_OCTET16_LEN); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(tt, passkey); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_TK; 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p_cb->tk; 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_callback) 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda, (tSMP_EVT_DATA *)&passkey); 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, (tSMP_INT_DATA *)&key); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_stk 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate STK calculated by running 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AES with the TK value as key and a concatenation of the random 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** values. 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_stk (tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 ptext; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = ptext; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_stk "); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p, 0, BT_OCTET16_LEN); 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->role == HCI_ROLE_MASTER) 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p, p_cb->rand, BT_OCTET8_LEN); 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p[BT_OCTET8_LEN], p_cb->rrand, BT_OCTET8_LEN); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p, p_cb->rrand, BT_OCTET8_LEN); 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&p[BT_OCTET8_LEN], p_cb->rand, BT_OCTET8_LEN); 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate STK = Etk(rand|rrand)*/ 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt( p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, &output)) 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("smp_generate_stk failed"); 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_stk(p_cb, &output); 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_confirm 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start the second pairing phase by 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** start generating initializer random number. 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_confirm (tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_confirm"); 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_genenrate_rand_cont 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate another 64 bits random for 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** MRand or Srand. 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_genenrate_rand_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_genenrate_rand_cont "); 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND_CONT; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate 64 MSB of MRand or SRand */ 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_ltk 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate LTK, starting with DIV 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generation. 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_ltk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN div_status; 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_ltk "); 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (div_status) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_genenrate_ltk_cont(p_cb, NULL); 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("Generate DIV for LTK"); 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_DIV_LTK; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_compute_csrk 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate CSRK 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_compute_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 er; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 buffer[4]; /* for (r || DIV) r=1*/ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 r=1; 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p=buffer; 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG1 ("smp_compute_csrk div=%x", p_cb->div); 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceEncRoot(er); 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CSRK = d1(ER, DIV, 1) */ 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, p_cb->div); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, r); 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output)) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("smp_generate_csrk failed"); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_cb->csrk, output.param_buf, BT_OCTET16_LEN); 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_send_csrk_info(p_cb, NULL); 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_csrk 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate LTK, starting with DIV 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generation. 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN div_status; 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_csrk"); 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (div_status) 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_compute_csrk(p_cb, NULL); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("Generate DIV for CSRK"); 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_DIV_CSRK; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_concatenate_peer 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** add pairing command sent from local device into p1. 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_concatenate_local( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code) 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_data; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_concatenate_local "); 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, op_code); 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_io_caps); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_oob_flag); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_auth_req); 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_enc_size); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_i_key); 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_r_key); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data = p; 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_concatenate_peer 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** add pairing command received from peer device into p1. 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_concatenate_peer( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code) 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_data; 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_concatenate_peer "); 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, op_code); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_io_caps); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_oob_flag); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_auth_req); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_enc_size); 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_i_key); 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_r_key); 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data = p; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_gen_p1_4_confirm 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Generate Confirm/Compare Step1: 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p1 = pres || preq || rat' || iat' 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_gen_p1_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p1) 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)p1; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_SEC_DEV_REC *p_dev_rec; 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_gen_p1_4_confirm"); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("can not generate confirm for unknown device"); 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ReadConnectionAddr(p_cb->local_bda); 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->role == HCI_ROLE_MASTER) 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : rat': initiator's(local) address type */ 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, 0); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : iat': responder's address type */ 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_dev_rec->ble.ble_addr_type); 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate preq */ 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_REQ); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate pres */ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_RSP); 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : iat': initiator's address type */ 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_dev_rec->ble.ble_addr_type); 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : rat': responder's(local) address type */ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, 0); 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate preq */ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_REQ); 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate pres */ 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_RSP); 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0("p1 = pres || preq || rat' || iat'"); 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1", 16); 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_gen_p2_4_confirm 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Generate Confirm/Compare Step2: 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p2 = padding || ia || ra 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_gen_p2_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p2) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)p2; 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_gen_p2_4_confirm"); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p, 0, sizeof(BT_OCTET16)); 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->role == HCI_ROLE_MASTER) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB ra */ 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->pairing_bda); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ia */ 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->local_bda); 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB ra */ 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->local_bda); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ia */ 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->pairing_bda); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0("p2 = padding || ia || ra"); 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p2, (const UINT8 *)"p2", 16); 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_calculate_comfirm 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate Confirm value. 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_calculate_comfirm (tSMP_CB *p_cb, BT_OCTET16 rand, BD_ADDR bda) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 p1; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_calculate_comfirm "); 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate p1 = pres || preq || rat' || iat' */ 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_gen_p1_4_confirm(p_cb, p1); 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p1 = rand XOR p1 */ 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_xor_128(p1, rand); 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1' = r XOR p1", 16); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate e(k, r XOR p1), where k = TK */ 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output)) 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("smp_generate_csrk failed"); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm_cont(p_cb, &output); 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_calculate_comfirm_cont 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when SConfirm/MConfirm is generated 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the Confirm request/response to peer device. 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_calculate_comfirm_cont(tSMP_CB *p_cb, tSMP_ENC *p) 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 p2; 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_calculate_comfirm_cont "); 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0("Confirm step 1 p1' = e(k, r XOR p1) Generated"); 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"C1", 16); 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_gen_p2_4_confirm(p_cb, p2); 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate p2 = (p1' XOR p2) */ 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_xor_128(p2, p->param_buf); 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p2, (const UINT8 *)"p2' = C1 xor p2", 16); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate: Confirm = E(k, p1' XOR p2) */ 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output)) 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("smp_calculate_comfirm_cont failed"); 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_cb->rand_enc_proc) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_CONFIRM: 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_confirm(p_cb, &output); 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_COMPARE: 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_compare(p_cb, &output); 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_genenrate_confirm 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a 48 bits random number is generated 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as SRand or MRand, continue to calculate Sconfirm or MConfirm. 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_genenrate_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_genenrate_confirm "); 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_CONFIRM; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rand, (const UINT8 *)"local rand", 16); 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm(p_cb, p_cb->rand, p_cb->pairing_bda); 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_compare 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate SConfirm for Slave device, 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or MSlave for Master device. This function can be also used for 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generating Compare number for confirm value check. 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_compare (tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_compare "); 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_COMPARE; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rrand, (const UINT8 *)"peer rand", 16); 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm(p_cb, p_cb->rrand, p_cb->local_bda); 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_confirm 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when SConfirm/MConfirm is generated 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the Confirm request/response to peer device. 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_confirm(tSMP_CB *p_cb, tSMP_ENC *p) 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_process_confirm "); 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_CONFORMANCE_TESTING == TRUE 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->enable_test_confirm_val) 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_TRACE_DEBUG0 ("Use confirm value from script"); 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->confirm, p_cb->test_confirm, BT_OCTET16_LEN); 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->confirm, p->param_buf, BT_OCTET16_LEN); 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->confirm, p->param_buf, BT_OCTET16_LEN); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0("Confirm Generated"); 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->confirm, (const UINT8 *)"Confirm", 16); 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_CFM; 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_compare 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when Compare is generated using the 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RRand and local BDA, TK information. 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_compare(tSMP_CB *p_cb, tSMP_ENC *p) 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_process_compare "); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0("Compare Generated"); 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"Compare", 16); 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_CMP; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_stk 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when STK is generated 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the encrypt the link using STK. 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_stk(tSMP_CB *p_cb, tSMP_ENC *p) 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_process_stk "); 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("STK Generated"); 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_mask_enc_key(p_cb->loc_enc_size, p->param_buf); 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_STK; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_genenrate_ltk_cont 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to calculate LTK = d1(ER, DIV, 0)= e(ER, DIV) 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_genenrate_ltk_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 er; 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_genenrate_ltk_cont "); 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceEncRoot(er); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LTK = d1(ER, DIV, 0)= e(ER, DIV)*/ 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(er, BT_OCTET16_LEN, (UINT8 *)&p_cb->div, 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(UINT16), &output)) 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("smp_genenrate_ltk_cont failed"); 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask the LTK */ 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_mask_enc_key(p_cb->loc_enc_size, output.param_buf); 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_cb->ltk, output.param_buf, BT_OCTET16_LEN); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_rand_vector(p_cb, NULL); 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_y 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to proceed generate Y = E(DHK, Rand) 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_y(tSMP_CB *p_cb, tSMP_INT_DATA *p) 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 dhk; 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_y "); 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceDHK(dhk); 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, p_cb->enc_rand, 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET8_LEN, &output)) 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("smp_generate_y failed"); 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_ediv(p_cb, &output); 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_rand_vector 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LTK is generated, send state machine 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event to SMP. 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p) 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate EDIV and rand now */ 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate random vector */ 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_generate_rand_vector "); 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->rand_enc_proc = SMP_GEN_RAND_V; 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_genenrate_smp_process_edivltk_cont 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to calculate EDIV = Y xor DIV 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_ediv(tSMP_CB *p_cb, tSMP_ENC *p) 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp= p->param_buf; 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 y; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG0 ("smp_process_ediv "); 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(y, pp); 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* EDIV = Y xor DIV */ 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->ediv = p_cb->div ^ y; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send LTK ready */ 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR0("LTK ready"); 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_LTK; 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_rand_back 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to process the rand command finished, 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** process the random/encrypted number for further action. 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_rand_back(tBTM_RAND_ENC *p) 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_CB *p_cb = &smp_cb; 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp = p->param_buf; 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 failure = SMP_PAIR_FAIL_UNKNOWN; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 state = p_cb->rand_enc_proc & ~0x80; 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_DEBUG1 ("smp_rand_back state=0x%x", state); 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p && p->status == HCI_SUCCESS) 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_SRAND_MRAND: 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_cb->rand, p->param_buf, p->param_len); 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_genenrate_rand_cont(p_cb, NULL); 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_SRAND_MRAND_CONT: 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_genenrate_confirm(p_cb, NULL); 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_DIV_LTK: 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(p_cb->div, pp); 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_genenrate_ltk_cont(p_cb, NULL); 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_DIV_CSRK: 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(p_cb->div, pp); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_compute_csrk(p_cb, NULL); 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_TK: 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_proc_passkey(p_cb, p); 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_RAND_V: 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->enc_rand, p->param_buf, BT_OCTET8_LEN); 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_y(p_cb, NULL); 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SMP_TRACE_ERROR1("smp_rand_back Key generation failed: (%d)", p_cb->rand_enc_proc); 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 910