smp_keys.c revision 5fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cd
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 3444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji * Copyright (C) 1999-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 * 21444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji * This file contains security manager protocol utility functions 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_INCLUDED == TRUE 27444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 28444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji #include <stdio.h> 29444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 30444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include <string.h> 31444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "bt_utils.h" 32444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "btm_ble_api.h" 33444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "smp_int.h" 34444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "btm_int.h" 35444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "btm_ble_int.h" 36444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "hcimsgs.h" 37444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "aes.h" 38444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "p_256_ecc_pp.h" 39444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#include "device/include/controller.h" 40444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 41444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#ifndef SMP_MAX_ENC_REPEAT 42444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji #define SMP_MAX_ENC_REPEAT 3 43444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_rand_back(tBTM_RAND_ENC *p); 46444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_generate_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data); 47444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_generate_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); 55444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic BOOLEAN smp_calculate_legacy_short_term_key(tSMP_CB *p_cb, tSMP_ENC *output); 56444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_continue_private_key_creation(tSMP_CB *p_cb, tBTM_RAND_ENC *p); 57444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_process_private_key(tSMP_CB *p_cb); 58444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_finish_nonce_generation(tSMP_CB *p_cb); 59444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_process_new_nonce(tSMP_CB *p_cb); 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const tSMP_ACT smp_encrypt_action[] = 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_compare, /* SMP_GEN_COMPARE */ 64444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_confirm, /* SMP_GEN_CONFIRM*/ 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_stk, /* SMP_GEN_STK*/ 66444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_ltk_cont, /* SMP_GEN_LTK */ 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_ltk, /* SMP_GEN_DIV_LTK */ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_rand_vector, /* SMP_GEN_RAND_V */ 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_y, /* SMP_GEN_EDIV */ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_passkey, /* SMP_GEN_TK */ 71444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_srand_mrand_confirm, /* SMP_GEN_SRAND_MRAND */ 72444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_rand_cont /* SMP_GEN_SRAND_MRAND_CONT */ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 75444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define SMP_PASSKEY_MASK 0xfff00000 76444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 77444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_debug_print_nbyte_little_endian(UINT8 *p, const UINT8 *key_name, UINT8 len) 78444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 79444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 80444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int ind, x; 81444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int col_count = 32; 82444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int row_count; 83444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 p_buf[512]; 84444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 85444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING("%s(LSB ~ MSB):", key_name); 86444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memset(p_buf, 0, sizeof(p_buf)); 87444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji row_count = len % col_count ? len / col_count + 1: len / col_count; 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 89444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ind = 0; 90444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int row = 0; row < row_count; row++) 91444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 92444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int column = 0, x = 0; (ind < len) && (column < col_count); column++, ind++) 93444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 94444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji x += sprintf((char *)&p_buf[x], "%02x ", p[ind]); 95444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 96444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING(" [%03d]: %s", row * col_count, p_buf); 97444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 98444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 99444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_debug_print_nbyte_big_endian (UINT8 *p, const UINT8 *key_name, UINT8 len) 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 p_buf[512]; 105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING("%s(MSB ~ LSB):", key_name); 107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memset(p_buf, 0, sizeof(p_buf)); 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int ind = 0; 110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int ncols = 32; /* num entries in one line */ 111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int nrows; /* num lines */ 112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int x; 113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 11433bab322187874ec92f8fe2fbcf4e65c6efca989Subramanian Srinivasan nrows = len % ncols ? len / ncols + 1: len / ncols; 115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int row = 0; row < nrows; row++) 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int col = 0, x = 0; (ind < len) && (col < ncols); col++, ind++) 118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji x += sprintf ((char *)&p_buf[len-x-1], "%02x ", p[ind]); 120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING("[%03d]: %s", row * ncols, p_buf); 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_encrypt_data 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to encrypt data. 131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** It uses AES-128 encryption algorithm. 132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Plain_text is encrypted using key, the result is at p_out. 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len, 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *plain_text, UINT8 pt_len, 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC *p_out) 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji aes_context ctx; 142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_start = NULL; 143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_rev_data = NULL; /* input data in big endilan format */ 145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_rev_key = NULL; /* input key in big endilan format */ 146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_rev_output = NULL; /* encrypted output in big endilan format */ 147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) ) 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR ("%s failed", __func__); 152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_start = (UINT8 *)osi_calloc(SMP_ENCRYT_DATA_SIZE * 4); 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pt_len > SMP_ENCRYT_DATA_SIZE) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pt_len = SMP_ENCRYT_DATA_SIZE; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_start; 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, plain_text, pt_len); /* byte 0 to byte 15 */ 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_data = p = p_start + SMP_ENCRYT_DATA_SIZE; /* start at byte 16 */ 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, p_start, SMP_ENCRYT_DATA_SIZE); /* byte 16 to byte 31 */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_key = p; /* start at byte 32 */ 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, key, SMP_ENCRYT_KEY_SIZE); /* byte 32 to byte 47 */ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE && SMP_DEBUG_VERBOSE == TRUE 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(key, (const UINT8 *)"Key", SMP_ENCRYT_KEY_SIZE); 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p_start, (const UINT8 *)"Plain text", SMP_ENCRYT_DATA_SIZE); 170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_output = p; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project aes_set_key(p_rev_key, SMP_ENCRYT_KEY_SIZE, &ctx); 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project aes_encrypt(p_rev_data, p, &ctx); /* outputs in byte 48 to byte 63 */ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_out->param_buf; 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, p_rev_output, SMP_ENCRYT_DATA_SIZE); 177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE && SMP_DEBUG_VERBOSE == TRUE 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p_out->param_buf, (const UINT8 *)"Encrypted text", SMP_ENCRYT_KEY_SIZE); 179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->param_len = SMP_ENCRYT_KEY_SIZE; 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->status = HCI_SUCCESS; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->opcode = HCI_BLE_ENCRYPT; 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 185abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_start); 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 187444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_passkey 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate passkey. 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_passkey(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2015cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 2025cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 204444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_TK; 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 210444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_proc_passkey 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process a passkey. 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_passkey(tSMP_CB *p_cb , tBTM_RAND_ENC *p) 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *tt = p_cb->tk; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 224ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT32 passkey; /* 19655 test number; */ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp = p->param_buf; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32(passkey, pp); 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey &= ~SMP_PASSKEY_MASK; 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* truncate by maximum value */ 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (passkey > BTM_MAX_PASSKEY_VAL) 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey >>= 1; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the TK */ 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_cb->tk, 0, BT_OCTET16_LEN); 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(tt, passkey); 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_TK; 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p_cb->tk; 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_callback) 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda, (tSMP_EVT_DATA *)&passkey); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_DISP) 248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &passkey); 250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 251444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_KEY_READY_EVT, (tSMP_INT_DATA *)&key); 254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_stk 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate STK calculated by running 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AES with the TK value as key and a concatenation of the random 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** values. 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_generate_stk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2705cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_ENC output; 273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->le_secure_connections_mode_is_used) 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("FOR LE SC LTK IS USED INSTEAD OF STK"); 280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output.param_len = SMP_ENCRYT_KEY_SIZE; 281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output.status = HCI_SUCCESS; 282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output.opcode = HCI_BLE_ENCRYPT; 283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(output.param_buf, p_cb->ltk, SMP_ENCRYT_DATA_SIZE); 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (!smp_calculate_legacy_short_term_key(p_cb, &output)) 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_stk(p_cb, &output); 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_srand_mrand_confirm 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start the second pairing phase by 300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** start generating random number. 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_generate_srand_mrand_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3085cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 3095cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_SRAND_MRAND; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_rand_cont 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate another 64 bits random for 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** MRand or Srand. 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_generate_rand_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3295cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 3305cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_SRAND_MRAND_CONT; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate 64 MSB of MRand or SRand */ 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_ltk 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called: 343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in legacy pairing - to calculate LTK, starting with DIV 344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** generation; 345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LE Secure Connections pairing over LE transport - to process LTK 346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** already generated to encrypt LE link; 347444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LE Secure Connections pairing over BR/EDR transport - to start 348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** BR/EDR Link Key processing. 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_ltk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3555cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 357444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN div_status; 358444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) 360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 361444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_br_process_link_key(p_cb, NULL); 362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (p_cb->le_secure_connections_mode_is_used) 365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_secure_connection_long_term_key(); 367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (div_status) 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_ltk_cont(p_cb, NULL); 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 378b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("Generate DIV for LTK"); 379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_DIV_LTK; 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_compute_csrk 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate CSRK 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_compute_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 398444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(p_data); 399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 er; 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 buffer[4]; /* for (r || DIV) r=1*/ 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 r=1; 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p=buffer; 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 407b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_compute_csrk div=%x", p_cb->div); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceEncRoot(er); 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CSRK = d1(ER, DIV, 1) */ 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, p_cb->div); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, r); 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output)) 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 415b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_generate_csrk failed"); 416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->smp_over_br) 417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status); 419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_cb->csrk, output.param_buf, BT_OCTET16_LEN); 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_send_csrk_info(p_cb, NULL); 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_csrk 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to calculate CSRK, starting with DIV 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generation. 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4455cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN div_status; 448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 449b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_csrk"); 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (div_status) 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_compute_csrk(p_cb, NULL); 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 458b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("Generate DIV for CSRK"); 459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_DIV_CSRK; 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_concatenate_peer 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** add pairing command sent from local device into p1. 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_concatenate_local( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code) 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_data; 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, op_code); 475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_cb->local_io_capability); 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_oob_flag); 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_auth_req); 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_enc_size); 479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_cb->local_i_key); 480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_cb->local_r_key); 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data = p; 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_concatenate_peer 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** add pairing command received from peer device into p1. 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_concatenate_peer( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code) 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_data; 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 493b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_concatenate_peer "); 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, op_code); 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_io_caps); 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_oob_flag); 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_auth_req); 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_enc_size); 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_i_key); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_r_key); 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data = p; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_gen_p1_4_confirm 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Generate Confirm/Compare Step1: 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p1 = pres || preq || rat' || iat' 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_gen_p1_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p1) 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)p1; 518ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type = 0; 519ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BD_ADDR remote_bda; 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 521b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_gen_p1_4_confirm"); 522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 523ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 525b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("can not generate confirm for unknown device"); 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 529ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_ReadConnectionAddr( p_cb->pairing_bda, p_cb->local_bda, &p_cb->addr_type); 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->role == HCI_ROLE_MASTER) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : rat': initiator's(local) address type */ 534ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, p_cb->addr_type); 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : iat': responder's address type */ 536ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, addr_type); 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate preq */ 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_REQ); 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate pres */ 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_RSP); 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : iat': initiator's address type */ 545ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, addr_type); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : rat': responder's(local) address type */ 547ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, p_cb->addr_type); 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate preq */ 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_REQ); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate pres */ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_RSP); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 554b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("p1 = pres || preq || rat' || iat'"); 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1", 16); 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 558444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_gen_p2_4_confirm 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Generate Confirm/Compare Step2: 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p2 = padding || ia || ra 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_gen_p2_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p2) 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 571ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 *p = (UINT8 *)p2; 572ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BD_ADDR remote_bda; 573ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type = 0; 574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 575ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) 576ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 577b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("can not generate confirm p2 for unknown device"); 578ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 579ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 581b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_gen_p2_4_confirm"); 582ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p, 0, sizeof(BT_OCTET16)); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->role == HCI_ROLE_MASTER) 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB ra */ 588ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BDADDR_TO_STREAM(p, remote_bda); 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ia */ 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->local_bda); 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB ra */ 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->local_bda); 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ia */ 597ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BDADDR_TO_STREAM(p, remote_bda); 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 600b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("p2 = padding || ia || ra"); 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p2, (const UINT8 *)"p2", 16); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 604444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_calculate_comfirm 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate Confirm value. 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_calculate_comfirm (tSMP_CB *p_cb, BT_OCTET16 rand, BD_ADDR bda) 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 616444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(bda); 617444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 p1; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 622b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_calculate_comfirm "); 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate p1 = pres || preq || rat' || iat' */ 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_gen_p1_4_confirm(p_cb, p1); 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p1 = rand XOR p1 */ 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_xor_128(p1, rand); 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1' = r XOR p1", 16); 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate e(k, r XOR p1), where k = TK */ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output)) 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 634b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_generate_csrk failed"); 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm_cont(p_cb, &output); 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 642444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_calculate_comfirm_cont 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when SConfirm/MConfirm is generated 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the Confirm request/response to peer device. 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_calculate_comfirm_cont(tSMP_CB *p_cb, tSMP_ENC *p) 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 p2; 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 659b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_calculate_comfirm_cont "); 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 661b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("Confirm step 1 p1' = e(k, r XOR p1) Generated"); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"C1", 16); 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_gen_p2_4_confirm(p_cb, p2); 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate p2 = (p1' XOR p2) */ 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_xor_128(p2, p->param_buf); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p2, (const UINT8 *)"p2' = C1 xor p2", 16); 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate: Confirm = E(k, p1' XOR p2) */ 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output)) 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 674b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_calculate_comfirm_cont failed"); 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 679444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->rand_enc_proc_state) 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_CONFIRM: 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_confirm(p_cb, &output); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_COMPARE: 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_compare(p_cb, &output); 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 691444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 694444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_confirm 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a 48 bits random number is generated 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as SRand or MRand, continue to calculate Sconfirm or MConfirm. 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 702444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_generate_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7045cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 7055cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 706444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 707444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_CONFIRM; 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rand, (const UINT8 *)"local rand", 16); 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm(p_cb, p_cb->rand, p_cb->pairing_bda); 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 711444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_compare 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate SConfirm for Slave device, 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or MSlave for Master device. This function can be also used for 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generating Compare number for confirm value check. 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_compare (tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7255cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 7265cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 727b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_compare "); 728444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_COMPARE; 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rrand, (const UINT8 *)"peer rand", 16); 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm(p_cb, p_cb->rrand, p_cb->local_bda); 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 732444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_confirm 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when SConfirm/MConfirm is generated 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the Confirm request/response to peer device. 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_confirm(tSMP_CB *p_cb, tSMP_ENC *p) 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 747444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->confirm, p->param_buf, BT_OCTET16_LEN); 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 751b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("Confirm Generated"); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->confirm, (const UINT8 *)"Confirm", 16); 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_CFM; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 759444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_compare 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when Compare is generated using the 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RRand and local BDA, TK information. 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_compare(tSMP_CB *p_cb, tSMP_ENC *p) 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 774b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_process_compare "); 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 776b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("Compare Generated"); 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"Compare", 16); 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_CMP; 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_stk 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when STK is generated 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the encrypt the link using STK. 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_stk(tSMP_CB *p_cb, tSMP_ENC *p) 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 799b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_process_stk "); 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 801b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("STK Generated"); 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_mask_enc_key(p_cb->loc_enc_size, p->param_buf); 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_STK; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 813444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_ltk_cont 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to calculate LTK = d1(ER, DIV, 0)= e(ER, DIV) 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_generate_ltk_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 822444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(p_data); 823444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 er; 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceEncRoot(er); 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LTK = d1(ER, DIV, 0)= e(ER, DIV)*/ 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(er, BT_OCTET16_LEN, (UINT8 *)&p_cb->div, 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(UINT16), &output)) 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 835444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask the LTK */ 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_mask_enc_key(p_cb->loc_enc_size, output.param_buf); 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_cb->ltk, output.param_buf, BT_OCTET16_LEN); 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_rand_vector(p_cb, NULL); 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_y 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to proceed generate Y = E(DHK, Rand) 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_y(tSMP_CB *p_cb, tSMP_INT_DATA *p) 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(p); 859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 dhk; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_y "); 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceDHK(dhk); 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, p_cb->enc_rand, 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET8_LEN, &output)) 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 871b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_generate_y failed"); 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_ediv(p_cb, &output); 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 879444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_rand_vector 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LTK is generated, send state machine 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event to SMP. 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p) 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8925cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p); 8935cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate EDIV and rand now */ 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate random vector */ 896b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_rand_vector "); 897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_RAND_V; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_process_ediv 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to calculate EDIV = Y xor DIV 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_ediv(tSMP_CB *p_cb, tSMP_ENC *p) 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp= p->param_buf; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 y; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 917b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_process_ediv "); 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(y, pp); 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* EDIV = Y xor DIV */ 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->ediv = p_cb->div ^ y; 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send LTK ready */ 923b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("LTK ready"); 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_LTK; 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_legacy_short_term_key 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 934444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates legacy STK. 935444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 939444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_legacy_short_term_key(tSMP_CB *p_cb, tSMP_ENC *output) 940444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 941444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 ptext; 942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = ptext; 943444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memset(p, 0, BT_OCTET16_LEN); 946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_MASTER) 947444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 948444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p, p_cb->rand, BT_OCTET8_LEN); 949444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(&p[BT_OCTET8_LEN], p_cb->rrand, BT_OCTET8_LEN); 950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p, p_cb->rrand, BT_OCTET8_LEN); 954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(&p[BT_OCTET8_LEN], p_cb->rand, BT_OCTET8_LEN); 955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 956444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 957444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN encrypted; 958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* generate STK = Etk(rand|rrand)*/ 959444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji encrypted = SMP_Encrypt( p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, output); 960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!encrypted) 961444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 962444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 963444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 964444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return encrypted; 965444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 966444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 967444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 968444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_create_private_key 970444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 971444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to create private key used to 972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** calculate public key and DHKey. 973444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The function starts private key creation requesting controller 974444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** to generate [0-7] octets of private key. 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_create_private_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s",__FUNCTION__); 982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_0_7; 983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 984444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 988444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_use_oob_private_key 990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called 992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - to save the secret key used to calculate the public key used 993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** in calculations of commitment sent OOB to a peer 994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - to use this secret key to recalculate the public key and 995444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** start the process of sending this public key to the peer 996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** if secret/public keys have to be reused. 997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** If the keys aren't supposed to be reused, continue from the 998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** point from which request for OOB data was issued. 999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_use_oob_private_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 1004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s req_oob_type: %d, role: %d", 1006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_cb->req_oob_type, p_cb->role); 1007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->req_oob_type) 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_OOB_BOTH: 1011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_OOB_LOCAL: 1012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s restore secret key", __func__) 1013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->private_key, p_cb->sc_oob_data.loc_oob_data.private_key_used, BT_OCTET32_LEN); 1014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_private_key(p_cb); 1015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s create secret key anew", __func__); 1018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_set_state(SMP_STATE_PAIR_REQ_RSP); 1019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_decide_association_model(p_cb, NULL); 1020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_continue_private_key_creation 1027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is used to continue private key creation. 1029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1030444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_continue_private_key_creation (tSMP_CB *p_cb, tBTM_RAND_ENC *p) 1034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 state = p_cb->rand_enc_proc_state & ~0x80; 1036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s state=0x%x", __func__, state); 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1038444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (state) 1039444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_0_7: 1041444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)p_cb->private_key, p->param_buf, p->param_len); 1042444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_8_15; 1043444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 1044444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 1045444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_8_15: 1048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->private_key[8], p->param_buf, p->param_len); 1049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_16_23; 1050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 1051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 1052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1053444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_16_23: 1055444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->private_key[16], p->param_buf, p->param_len); 1056444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_24_31; 1057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 1058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 1059444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_24_31: 1062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->private_key[24], p->param_buf, p->param_len); 1063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_private_key (p_cb); 1064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1065444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1074444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_process_private_key 1076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function processes private key. 1078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** It calculates public key and notifies SM that private key / 1079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** public key pair is created. 1080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1081444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1082444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1083444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1084444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_process_private_key(tSMP_CB *p_cb) 1085444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1086444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji Point public_key; 1087444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32 private_key; 1088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN); 1092444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ECC_PointMult(&public_key, &(curve_p256.G), (DWORD*) private_key, KEY_LENGTH_DWORDS_P256); 1093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->loc_publ_key.x, public_key.x, BT_OCTET32_LEN); 1094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->loc_publ_key.y, public_key.y, BT_OCTET32_LEN); 1095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->private_key, (const UINT8 *)"private", 1097444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1098444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->loc_publ_key.x, (const UINT8 *)"local public(x)", 1099444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1100444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->loc_publ_key.y, (const UINT8 *)"local public(y)", 1101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->flags |= SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY; 1103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_LOC_PUBL_KEY_CRTD_EVT, NULL); 1104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_compute_dhkey 1109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function: 1111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - calculates a new public key using as input local private 1112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** key and peer public key; 1113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - saves the new public key x-coordinate as DHKey. 1114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_compute_dhkey (tSMP_CB *p_cb) 1119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji Point peer_publ_key, new_publ_key; 1121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32 private_key; 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN); 1126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(peer_publ_key.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN); 1127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(peer_publ_key.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN); 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ECC_PointMult(&new_publ_key, &peer_publ_key, (DWORD*) private_key, KEY_LENGTH_DWORDS_P256); 1130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->dhkey, new_publ_key.x, BT_OCTET32_LEN); 1132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->dhkey, (const UINT8 *)"Old DHKey", 1134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->private_key, (const UINT8 *)"private", 1137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->peer_publ_key.x, (const UINT8 *)"rem public(x)", 1139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->peer_publ_key.y, (const UINT8 *)"rem public(y)", 1141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->dhkey, (const UINT8 *)"Reverted DHKey", 1143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_local_commitment 1149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves local commmitment in CB. 1151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_local_commitment(tSMP_CB *p_cb) 1156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 random_input; 1158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s", __FUNCTION__); 1160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->selected_association_model) 1162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_JUSTWORKS: 1164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_NUM_COMP: 1165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_MASTER) 1166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("local commitment calc on master is not expected \ 1167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for Just Works/Numeric Comparison models"); 1168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 0, 1169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->commitment); 1170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji random_input = smp_calculate_random_input(p_cb->local_random, p_cb->round); 1174444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 1175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji random_input, p_cb->commitment); 1176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_OOB: 1178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("local commitment calc is expected for OOB model BEFORE pairing"); 1179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->loc_publ_key.x, p_cb->local_random, 0, 1180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->commitment); 1181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("Association Model = %d is not used in LE SC", 1184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->selected_association_model); 1185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("local commitment calculation is completed"); 1189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1192444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1193444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_peer_commitment 1194444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves peer commmitment at the 1196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** provided output buffer. 1197444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1198444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1199444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1201444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_peer_commitment(tSMP_CB *p_cb, BT_OCTET16 output_buf) 1202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 ri; 1204444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1206444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1207444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->selected_association_model) 1208444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1209444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_JUSTWORKS: 1210444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_NUM_COMP: 1211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_SLAVE) 1212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("peer commitment calc on slave is not expected \ 1213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for Just Works/Numeric Comparison models"); 1214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, 0, 1215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output_buf); 1216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ri = smp_calculate_random_input(p_cb->peer_random, p_cb->round); 1220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, ri, 1221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output_buf); 1222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_OOB: 1224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->peer_publ_key.x, p_cb->peer_random, 0, 1225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output_buf); 1226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("Association Model = %d is not used in LE SC", 1229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->selected_association_model); 1230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("peer commitment calculation is completed"); 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f4 1239444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 1241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** C = f4(U, V, X, Z) = AES-CMAC (U||V||Z) 1242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X 1243444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: U is 256 bit, 1245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** V is 256 bit, 1246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X is 128 bit, 1247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Z is 8 bit, 1248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: C is 128 bit. 1249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1251444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_f4(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 z, UINT8 *c) 1257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = BT_OCTET32_LEN /* U size */ + BT_OCTET32_LEN /* V size */ + 1 /* Z size */; 1259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[BT_OCTET32_LEN + BT_OCTET32_LEN + 1]; 1260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = u; 1271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"U", BT_OCTET32_LEN); 1272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = v; 1273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"V", BT_OCTET32_LEN); 1274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = x; 1275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"X", BT_OCTET16_LEN); 1276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = &z; 1277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Z", 1); 1278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, z); 1282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, v, BT_OCTET32_LEN); 1283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, u, BT_OCTET32_LEN); 1284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = msg; 1286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"M", msg_len); 1287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, x, BT_OCTET16_LEN); 1291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac); 1297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES_CMAC", BT_OCTET16_LEN); 1300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = c; 1303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_numeric_comparison_display_number 1309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves number to display in numeric 1311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** comparison association mode. 1312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_numeric_comparison_display_number(tSMP_CB *p_cb, 1317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_INT_DATA *p_data) 1318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 1320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_MASTER) 1322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->number_to_display = 1324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_g2(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 1325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rrand); 1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->number_to_display = 1330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_g2(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, 1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand); 1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->number_to_display >= (BTM_MAX_PASSKEY_VAL + 1)) 1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 reason; 1337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji reason = p_cb->failure = SMP_PAIR_FAIL_UNKNOWN; 1338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT("Number to display in numeric comparison = %d", p_cb->number_to_display); 1343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->cb_evt = SMP_NC_REQ_EVT; 1344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_SC_DSPL_NC_EVT, &p_cb->number_to_display); 1345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1347444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_g2 1351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 1353444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** g2(U, V, X, Y) = AES-CMAC (U||V||Y) mod 2**32 mod 10**6 1354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X 1355444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** and 1356444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Vres = g2(U, V, X, Y) mod 10**6 1357444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1358444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: U is 256 bit, 1359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** V is 256 bit, 1360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X is 128 bit, 1361444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Y is 128 bit, 1362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns Vres. 1364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Expected value has to be in the range [0 - 999999] i.e. [0 - 0xF423F]. 1365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Vres = 1000000 means that the calculation fails. 1366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1370444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1371444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiUINT32 smp_calculate_g2(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 *y) 1372444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1373444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = BT_OCTET32_LEN /* U size */ + BT_OCTET32_LEN /* V size */ 1374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji + BT_OCTET16_LEN /* Y size */; 1375444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[BT_OCTET32_LEN + BT_OCTET32_LEN + BT_OCTET16_LEN]; 1376444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT32 vres; 1380444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1381444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1382444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1383444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1385444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, y, BT_OCTET16_LEN); 1388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, v, BT_OCTET32_LEN); 1389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, u, BT_OCTET32_LEN); 1390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1391444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = u; 1392444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"U", BT_OCTET32_LEN); 1393444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = v; 1394444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"V", BT_OCTET32_LEN); 1395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = x; 1396444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"X", BT_OCTET16_LEN); 1397444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = y; 1398444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Y", BT_OCTET16_LEN); 1399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, x, BT_OCTET16_LEN); 1403444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1408444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if(!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 1409444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed",__FUNCTION__); 1411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return (BTM_MAX_PASSKEY_VAL + 1); 1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* vres = cmac mod 2**32 mod 10**6 */ 1420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = &cmac[0]; 1421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT32(vres, p); 1422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = (UINT8 *) &vres; 1424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"cmac mod 2**32", 4); 1425444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1426444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1427444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji while (vres > BTM_MAX_PASSKEY_VAL) 1428444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji vres -= (BTM_MAX_PASSKEY_VAL + 1); 1429444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1430444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = (UINT8 *) &vres; 1431444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"cmac mod 2**32 mod 10**6", 4); 1432444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("Value for numeric comparison = %d", vres); 1435444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return vres; 1436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f5 1441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1442444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function provides two AES-CMAC that are supposed to be used as 1443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - MacKey (MacKey is used in pairing DHKey check calculation); 1444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - LTK (LTK is used to ecrypt the link after completion of Phase 2 1445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** and on reconnection, to derive BR/EDR LK). 1446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The function inputs are W, N1, N2, A1, A2. 1447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** F5 rules: 1448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - the value used as key in MacKey/LTK (T) is calculated 1449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** (function smp_calculate_f5_key(...)); 1450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The formula is: 1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T = AES-CMAC (W) 1452444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** salt 1453444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where salt is internal parameter of smp_calculate_f5_key(...). 1454444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - MacKey and LTK are calculated as AES-MAC values received with the 1455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** key T calculated in the previous step and the plaintext message 1456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** built from the external parameters N1, N2, A1, A2 and the internal 1457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** parameters counter, keyID, length. 1458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The function smp_calculate_f5_mackey_or_long_term_key(...) is used in the 1459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** calculations. 1460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The same formula is used in calculation of MacKey and LTK and the 1461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** same parameter values except the value of the internal parameter 1462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** counter: 1463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in MacKey calculations the value is 0; 1464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LTK calculations the value is 1. 1465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey = AES-CMAC (Counter=0||keyID||N1||N2||A1||A2||Length=256) 1466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T 1467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LTK = AES-CMAC (Counter=1||keyID||N1||N2||A1||A2||Length=256) 1468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T 1469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The parameters are 1470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: 1471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** W is 256 bits, 1472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N1 is 128 bits, 1473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N2 is 128 bits, 1474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A1 is 56 bit, 1475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A2 is 56 bit. 1476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** internal: 1477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Counter is 8 bits, its value is 0 for MacKey, 1478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1 for LTK; 1479444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** KeyId is 32 bits, its value is 1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 0x62746c65 (MSB~LSB); 1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Length is 16 bits, its value is 0x0100 1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** (MSB~LSB). 1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: 1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey is 128 bits; 1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LTK is 128 bits 1486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1493444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, 1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *mac_key, UINT8 *ltk) 1495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 t; /* AES-CMAC output in smp_calculate_f5_key(...), key in */ 1497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* smp_calculate_f5_mackey_or_long_term_key(...) */ 1498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* internal parameters: */ 1502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji counter is 0 for MacKey, 1505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji is 1 for LTK 1506444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1507444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 counter_mac_key[1] = {0}; 1508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 counter_ltk[1] = {1}; 1509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji keyID 62746c65 1511444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1512444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key_id[4] = {0x65, 0x6c, 0x74, 0x62}; 1513444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji length 0100 1515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1516444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 length[2] = {0x00, 0x01}; 1517444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1518444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1519444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1520444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = w; 1521444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"W", BT_OCTET32_LEN); 1522444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n1; 1523444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N1", BT_OCTET16_LEN); 1524444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n2; 1525444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N2", BT_OCTET16_LEN); 1526444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a1; 1527444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"A1", 7); 1528444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a2; 1529444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt,(const UINT8 *) "A2", 7); 1530444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1531444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1532444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!smp_calculate_f5_key(w, t)) 1533444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1534444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to calc T",__FUNCTION__); 1535444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1536444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1537444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1538444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = t; 1539444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"T", BT_OCTET16_LEN); 1540444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1541444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1542444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!smp_calculate_f5_mackey_or_long_term_key(t, counter_mac_key, key_id, n1, n2, a1, a2, 1543444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji length, mac_key)) 1544444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1545444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to calc MacKey", __FUNCTION__); 1546444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1547444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1548444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1549444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = mac_key; 1550444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"MacKey", BT_OCTET16_LEN); 1551444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1552444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1553444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!smp_calculate_f5_mackey_or_long_term_key(t, counter_ltk, key_id, n1, n2, a1, a2, 1554444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji length, ltk)) 1555444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1556444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to calc LTK",__FUNCTION__); 1557444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1558444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1559444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1560444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = ltk; 1561444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"LTK", BT_OCTET16_LEN); 1562444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1563444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1564444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 1565444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1566444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1567444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1568444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1569444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f5_mackey_or_long_term_key 1570444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1571444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates the value of MacKey or LTK by the rules 1572444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** defined for f5 function. 1573444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** At the moment exactly the same formula is used to calculate 1574444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LTK and MacKey. 1575444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The difference is the value of input parameter Counter: 1576444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in MacKey calculations the value is 0; 1577444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LTK calculations the value is 1. 1578444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The formula: 1579444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** mac = AES-CMAC (Counter||keyID||N1||N2||A1||A2||Length) 1580444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T 1581444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1582444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: T is 256 bits; 1583444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Counter is 8 bits, its value is 0 for MacKey, 1584444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1 for LTK; 1585444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** keyID is 32 bits, its value is 0x62746c65; 1586444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N1 is 128 bits; 1587444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N2 is 128 bits; 1588444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A1 is 56 bits; 1589444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A2 is 56 bits; 1590444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Length is 16 bits, its value is 0x0100 1591444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: LTK is 128 bit. 1592444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1593444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1594444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1595444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1596444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1597444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1598444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1599444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f5_mackey_or_long_term_key(UINT8 *t, UINT8 *counter, 1600444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *key_id, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, 1601444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *length, UINT8 *mac) 1602444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1603444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1604444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1605444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1606444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = 1 /* Counter size */ + 4 /* keyID size */ + 1607444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16_LEN /* N1 size */ + BT_OCTET16_LEN /* N2 size */ + 1608444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7 /* A1 size*/ + 7 /* A2 size*/ + 2 /* Length size */; 1609444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[1 + 4 + BT_OCTET16_LEN + BT_OCTET16_LEN + 7 + 7 + 2]; 1610444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1611444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1612444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1613444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1614444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1615444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1616444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1617444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = t; 1618444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"T", BT_OCTET16_LEN); 1619444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = counter; 1620444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Counter", 1); 1621444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key_id; 1622444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"KeyID", 4); 1623444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n1; 1624444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N1", BT_OCTET16_LEN); 1625444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n2; 1626444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N2", BT_OCTET16_LEN); 1627444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a1; 1628444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"A1", 7); 1629444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a2; 1630444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"A2", 7); 1631444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = length; 1632444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Length", 2); 1633444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1634444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1635444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1636444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, t, BT_OCTET16_LEN); 1637444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1638444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1639444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1640444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1641444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1642444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, length, 2); 1643444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a2, 7); 1644444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a1, 7); 1645444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n2, BT_OCTET16_LEN); 1646444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n1, BT_OCTET16_LEN); 1647444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, key_id, 4); 1648444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, counter, 1); 1649444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1650444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = msg; 1651444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"M", msg_len); 1652444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1653444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1654444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 1655444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1656444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __FUNCTION__); 1657444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 1658444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1659444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1660444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1661444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1662444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1663444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1664444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1665444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = mac; 1666444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1667444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1668444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1669444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1670444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1671444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1672444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f5_key 1673444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1674444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates key T used in calculation of 1675444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey and LTK (f5 output is defined as MacKey || LTK). 1676444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T = AES-CMAC (W) 1677444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** salt 1678444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1679444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Internal: salt is 128 bit. 1680444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: W is 256 bit. 1681444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Output: T is 128 bit. 1682444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1683444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1684444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1685444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1686444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1687444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1688444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1689444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f5_key(UINT8 *w, UINT8 *t) 1690444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1691444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1692444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Please see 2.2.7 LE Secure Connections Key Generation Function f5 */ 1693444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1694444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji salt: 6C88 8391 AAF5 A538 6037 0BDB 5A60 83BE 1695444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1696444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 salt = { 1697444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 0xBE, 0x83, 0x60, 0x5A, 0xDB, 0x0B, 0x37, 0x60, 1698444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 0x38, 0xA5, 0xF5, 0xAA, 0x91, 0x83, 0x88, 0x6C 1699444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji }; 1700444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1701444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1702444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1703444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1704444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1705444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1706444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = salt; 1707444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"salt", BT_OCTET16_LEN); 1708444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = w; 1709444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"W", BT_OCTET32_LEN); 1710444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1711444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1712444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 key; 1713444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32 msg; 1714444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1715444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1716444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, salt, BT_OCTET16_LEN); 1717444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1718444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, w, BT_OCTET32_LEN); 1719444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1720444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1721444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1722444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = msg; 1723444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"M", BT_OCTET32_LEN); 1724444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1725444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1726444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 cmac; 1727444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1728444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!aes_cipher_msg_auth_code(key, msg, BT_OCTET32_LEN, BT_OCTET16_LEN, cmac)) 1729444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1730444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __FUNCTION__); 1731444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 1732444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1733444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1734444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1735444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1736444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1737444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1738444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1739444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = t; 1740444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1741444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1742444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1743444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1744444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1745444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1746444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_local_dhkey_check 1747444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1748444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves local device DHKey check 1749444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** value in CB. 1750444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Before doing this it calls smp_calculate_f5_mackey_and_long_term_key(...). 1751444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** to calculate MacKey and LTK. 1752444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey is used in dhkey calculation. 1753444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1754444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1755444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1756444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1757444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_local_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 1758444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1759444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 iocap[3], a[7], b[7]; 1760444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1761444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1762444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1763444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f5_mackey_and_long_term_key(p_cb); 1764444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1765444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_local_io_capabilities(iocap, p_cb); 1766444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1767444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_local_ble_address(a, p_cb); 1768444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_peer_ble_address(b, p_cb); 1769444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f6(p_cb->mac_key, p_cb->rand, p_cb->rrand, p_cb->peer_random, iocap, a, b, 1770444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->dhkey_check); 1771444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1772444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("local DHKey check calculation is completed"); 1773444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1774444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1775444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1776444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1777444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_peer_dhkey_check 1778444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1779444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates peer device DHKey check value. 1780444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1781444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1782444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1783444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1784444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_peer_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 1785444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1786444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 iocap[3], a[7], b[7]; 1787444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 param_buf; 1788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret; 1789444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_KEY key; 1790444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 1791444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1792444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1793444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1794444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_peer_io_capabilities(iocap, p_cb); 1795444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1796444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_local_ble_address(a, p_cb); 1797444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_peer_ble_address(b, p_cb); 1798444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_f6(p_cb->mac_key, p_cb->rrand, p_cb->rand, p_cb->local_random, iocap, 1799444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji b, a, param_buf); 1800444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1801444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (ret) 1802444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1803444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("peer DHKey check calculation is completed"); 1804444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (SMP_DEBUG == TRUE) 1805444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (param_buf, (const UINT8 *)"peer DHKey check", 1806444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16_LEN); 1807444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji key.key_type = SMP_KEY_TYPE_PEER_DHK_CHCK; 1809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji key.p_data = param_buf; 1810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_SC_KEY_READY_EVT, &key); 1811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1812444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1813444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("peer DHKey check calculation failed"); 1815444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 1816444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1817444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f6 1822444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1823444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 1824444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** C = f6(W, N1, N2, R, IOcap, A1, A2) = AES-CMAC (N1||N2||R||IOcap||A1||A2) 1825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** W 1826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1827444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: W is 128 bit, 1828444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N1 is 128 bit, 1829444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N2 is 128 bit, 1830444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** R is 128 bit, 1831444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** IOcap is 24 bit, 1832444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A1 is 56 bit, 1833444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A2 is 56 bit, 1834444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: C is 128 bit. 1835444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1836444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1837444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1842444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f6(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *r, UINT8 *iocap, UINT8 *a1, 1843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *a2, UINT8 *c) 1844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = BT_OCTET16_LEN /* N1 size */ + BT_OCTET16_LEN /* N2 size */ + 1847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16_LEN /* R size */ + 3 /* IOcap size */ + 7 /* A1 size*/ 1848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji + 7 /* A2 size*/; 1849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[BT_OCTET16_LEN + BT_OCTET16_LEN + BT_OCTET16_LEN + 3 + 7 + 7]; 1850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_print = NULL; 1852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1854444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = w; 1857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"W", BT_OCTET16_LEN); 1858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = n1; 1859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"N1", BT_OCTET16_LEN); 1860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = n2; 1861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"N2", BT_OCTET16_LEN); 1862444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = r; 1863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"R", BT_OCTET16_LEN); 1864444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = iocap; 1865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"IOcap", 3); 1866444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = a1; 1867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"A1", 7); 1868444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = a2; 1869444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"A2", 7); 1870444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1871444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1873444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1874444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1875444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1876444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, w, BT_OCTET16_LEN); 1877444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = key; 1879444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"K", BT_OCTET16_LEN); 1880444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1881444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1882444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a2, 7); 1884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a1, 7); 1885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, iocap, 3); 1886444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, r, BT_OCTET16_LEN); 1887444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n2, BT_OCTET16_LEN); 1888444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n1, BT_OCTET16_LEN); 1889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = msg; 1891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"M", msg_len); 1892444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1893444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1895444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if(!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 1896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __FUNCTION__); 1898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 1899444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = cmac; 1903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = c; 1907444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1910444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1911444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1913444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_link_key_from_long_term_key 1914444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1915444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves BR/EDR link key derived from 1916444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LE SC LTK. 1917444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1919444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1921444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_link_key_from_long_term_key(tSMP_CB *p_cb) 1922444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1923444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec; 1924e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BD_ADDR bda_for_lk; 1925e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBLE_ADDR_TYPE conn_addr_type; 1926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1927444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 1928444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1929e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_cb->id_addr_rcvd && p_cb->id_addr_type == BLE_ADDR_PUBLIC) 1930e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 1931e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_TRACE_DEBUG ("Use rcvd identity address as BD_ADDR of LK rcvd identity address"); 1932e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun memcpy(bda_for_lk, p_cb->id_addr, BD_ADDR_LEN); 1933e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 1934e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else if ((BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda_for_lk, &conn_addr_type)) && 1935e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun conn_addr_type == BLE_ADDR_PUBLIC) 1936e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 1937e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_TRACE_DEBUG ("Use rcvd connection address as BD_ADDR of LK"); 1938e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 1939e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 1940e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 1941e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_TRACE_WARNING ("Don't have peer public address to associate with LK"); 1942e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun return FALSE; 1943e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 1944e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 1945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) 1946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1947444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to find Security Record", __func__); 1948444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1949444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 intermediate_link_key; 1952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(p_cb->ltk, (UINT8 *)"1pmt" /* reversed "tmp1" */,intermediate_link_key); 1955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 1956444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1957444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to derive intermediate_link_key", __func__); 1958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1959444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1961444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 link_key; 1962444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(intermediate_link_key, (UINT8 *) "rbel" /* reversed "lebr" */, link_key); 1963444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 1964444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1965444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 1966444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1967444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1968444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 link_key_type; 1970444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_cb.security_mode == BTM_SEC_MODE_SC) 1971444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Secure Connections Only Mode */ 1973444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_AUTH_COMB_P_256; 1974444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1975444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (controller_get_interface()->supports_secure_connections()) 1976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1977444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* both transports are SC capable */ 1978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) 1979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_AUTH_COMB_P_256; 1980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB_P_256; 1982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (btm_cb.security_mode == BTM_SEC_MODE_SP) 1984444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* BR/EDR transport is SSP capable */ 1986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) 1987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_AUTH_COMB; 1988444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; 1990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR ("%s failed to update link_key. Sec Mode = %d, sm4 = 0x%02x", 1994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, btm_cb.security_mode, p_dev_rec->sm4); 1995444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type += BTM_LTK_DERIVED_LKEY_OFFSET; 1999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p; 2001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 notif_link_key; 2002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = notif_link_key; 2003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY16_TO_STREAM(p, link_key); 2004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2005e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_sec_link_key_notification (bda_for_lk, notif_link_key, link_key_type); 2006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("%s is completed", __func__); 2008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2009444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 2011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_long_term_key_from_link_key 2016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves SC LTK derived from BR/EDR 2018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** link key. 2019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 2021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2023444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_long_term_key_from_link_key(tSMP_CB *p_cb) 2024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 2026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec; 2027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 rev_link_key[16]; 2028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 2030444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) 2032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to find Security Record",__FUNCTION__); 2034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 2035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2037444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 br_link_key_type; 2038444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((br_link_key_type = BTM_SecGetDeviceLinkKeyType (p_cb->pairing_bda)) 2039444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji == BTM_LKEY_TYPE_IGNORE) 2040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2041444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to retrieve BR link type",__FUNCTION__); 2042444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 2043444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2044444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2045444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((br_link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256) && 2046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (br_link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) 2047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s LE SC LTK can't be derived from LK %d", 2049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, br_link_key_type); 2050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 2051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2053444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p1; 2054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p2; 2055444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p1 = rev_link_key; 2056444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p2 = p_dev_rec->link_key; 2057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji REVERSE_ARRAY_TO_STREAM(p1, p2, 16); 2058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2059444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 intermediate_long_term_key; 2060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* "tmp2" obtained from the spec */ 2061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(rev_link_key, (UINT8 *) "2pmt" /* reversed "tmp2" */, 2062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji intermediate_long_term_key); 2063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 2065444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to derive intermediate_long_term_key",__FUNCTION__); 2067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 2068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* "brle" obtained from the spec */ 2071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(intermediate_long_term_key, (UINT8 *) "elrb" /* reversed "brle" */, 2072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->ltk); 2073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2074444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 2075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed",__FUNCTION__); 2077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 2079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->sec_level = (br_link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) 2081444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ? SMP_SEC_AUTHENTICATED : SMP_SEC_UNAUTHENTICATE; 2082444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("%s is completed",__FUNCTION__); 2083444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2084444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2085444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 2086444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2087444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_h6 2091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2092444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 2093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** C = h6(W, KeyID) = AES-CMAC (KeyID) 2094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** W 2095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 2096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: W is 128 bit, 2097444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** KeyId is 32 bit, 2098444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: C is 128 bit. 2099444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2100444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 2101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 2103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 2104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2106444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_h6(UINT8 *w, UINT8 *keyid, UINT8 *c) 2107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_print = NULL; 2110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s",__FUNCTION__); 2113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = w; 2115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"W", BT_OCTET16_LEN); 2116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = keyid; 2117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"keyID", 4); 2118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 2121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 2122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 2124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, w, BT_OCTET16_LEN); 2125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = key; 2128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"K", BT_OCTET16_LEN); 2129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = 4 /* KeyID size */; 2132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[4]; 2133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 2135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, keyid, 4); 2136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = msg; 2139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print,(const UINT8 *) "M", msg_len); 2140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 2143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 2144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 2145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed",__FUNCTION__); 2147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 2148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = cmac; 2152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 2153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = c; 2156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 2157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 2158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_start_nonce_generation 2163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function starts nonce generation. 2165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_start_nonce_generation(tSMP_CB *p_cb) 2170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s", __FUNCTION__); 2172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_NONCE_0_7; 2173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 2174444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 2175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_finish_nonce_generation 2180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function finishes nonce generation. 2182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_finish_nonce_generation(tSMP_CB *p_cb) 2187444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s", __FUNCTION__); 2189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_NONCE_8_15; 2190444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 2191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 2192444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2193444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2194444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_process_new_nonce 2197444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2198444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function notifies SM that it has new nonce. 2199444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2201444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_process_new_nonce(tSMP_CB *p_cb) 2204444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s round %d", __FUNCTION__, p_cb->round); 2206444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_HAVE_LOC_NONCE_EVT, NULL); 2207444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2208444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2209444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2210444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_rand_back 2212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is to process the rand command finished, 2214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** process the random/encrypted number for further action. 2215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_rand_back(tBTM_RAND_ENC *p) 2220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_CB *p_cb = &smp_cb; 2222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *pp = p->param_buf; 2223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 failure = SMP_PAIR_FAIL_UNKNOWN; 2224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 state = p_cb->rand_enc_proc_state & ~0x80; 2225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s state=0x%x", __FUNCTION__, state); 2227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p && p->status == HCI_SUCCESS) 2228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (state) 2230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_SRAND_MRAND: 2232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)p_cb->rand, p->param_buf, p->param_len); 2233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_rand_cont(p_cb, NULL); 2234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_SRAND_MRAND_CONT: 2237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); 2238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_confirm(p_cb, NULL); 2239444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_DIV_LTK: 2242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT16(p_cb->div, pp); 2243444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_ltk_cont(p_cb, NULL); 2244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_DIV_CSRK: 2247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT16(p_cb->div, pp); 2248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_compute_csrk(p_cb, NULL); 2249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2251444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_TK: 2252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_proc_passkey(p_cb, p); 2253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_RAND_V: 2256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->enc_rand, p->param_buf, BT_OCTET8_LEN); 2257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_y(p_cb, NULL); 2258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_0_7: 2261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_8_15: 2262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_16_23: 2263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_24_31: 2264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_continue_private_key_creation(p_cb, p); 2265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_NONCE_0_7: 2268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)p_cb->rand, p->param_buf, p->param_len); 2269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_finish_nonce_generation(p_cb); 2270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_NONCE_8_15: 2273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); 2274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_new_nonce(p_cb); 2275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 2279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s key generation failed: (%d)", __FUNCTION__, p_cb->rand_enc_proc_state); 2282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 2283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2287