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