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 61444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#define SMP_PASSKEY_MASK 0xfff00000 62444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 63444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_debug_print_nbyte_little_endian(UINT8 *p, const UINT8 *key_name, UINT8 len) 64444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 65444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 66444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int ind, x; 67444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int col_count = 32; 68444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int row_count; 69444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 p_buf[512]; 70444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 71444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING("%s(LSB ~ MSB):", key_name); 72444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memset(p_buf, 0, sizeof(p_buf)); 73444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji row_count = len % col_count ? len / col_count + 1: len / col_count; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 75444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ind = 0; 76444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int row = 0; row < row_count; row++) 77444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 78444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int column = 0, x = 0; (ind < len) && (column < col_count); column++, ind++) 79444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 80444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji x += sprintf((char *)&p_buf[x], "%02x ", p[ind]); 81444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 82444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING(" [%03d]: %s", row * col_count, p_buf); 83444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 84444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 85444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 87444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_debug_print_nbyte_big_endian (UINT8 *p, const UINT8 *key_name, UINT8 len) 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 89444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 90444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 p_buf[512]; 91444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 92444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING("%s(MSB ~ LSB):", key_name); 93444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memset(p_buf, 0, sizeof(p_buf)); 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 95444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int ind = 0; 96444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int ncols = 32; /* num entries in one line */ 97444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int nrows; /* num lines */ 98444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji int x; 99444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 10033bab322187874ec92f8fe2fbcf4e65c6efca989Subramanian Srinivasan nrows = len % ncols ? len / ncols + 1: len / ncols; 101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int row = 0; row < nrows; row++) 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for (int col = 0, x = 0; (ind < len) && (col < ncols); col++, ind++) 104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji x += sprintf ((char *)&p_buf[len-x-1], "%02x ", p[ind]); 106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING("[%03d]: %s", row * ncols, p_buf); 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_encrypt_data 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to encrypt data. 117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** It uses AES-128 encryption algorithm. 118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Plain_text is encrypted using key, the result is at p_out. 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len, 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *plain_text, UINT8 pt_len, 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC *p_out) 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji aes_context ctx; 128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_start = NULL; 129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_rev_data = NULL; /* input data in big endilan format */ 131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_rev_key = NULL; /* input key in big endilan format */ 132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_rev_output = NULL; /* encrypted output in big endilan format */ 133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) ) 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR ("%s failed", __func__); 138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_start = (UINT8 *)osi_calloc(SMP_ENCRYT_DATA_SIZE * 4); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pt_len > SMP_ENCRYT_DATA_SIZE) 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pt_len = SMP_ENCRYT_DATA_SIZE; 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_start; 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ARRAY_TO_STREAM (p, plain_text, pt_len); /* byte 0 to byte 15 */ 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_data = p = p_start + SMP_ENCRYT_DATA_SIZE; /* start at byte 16 */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, p_start, SMP_ENCRYT_DATA_SIZE); /* byte 16 to byte 31 */ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_key = p; /* start at byte 32 */ 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, key, SMP_ENCRYT_KEY_SIZE); /* byte 32 to byte 47 */ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE && SMP_DEBUG_VERBOSE == TRUE 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(key, (const UINT8 *)"Key", SMP_ENCRYT_KEY_SIZE); 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p_start, (const UINT8 *)"Plain text", SMP_ENCRYT_DATA_SIZE); 156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_rev_output = p; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project aes_set_key(p_rev_key, SMP_ENCRYT_KEY_SIZE, &ctx); 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project aes_encrypt(p_rev_data, p, &ctx); /* outputs in byte 48 to byte 63 */ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = p_out->param_buf; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project REVERSE_ARRAY_TO_STREAM (p, p_rev_output, SMP_ENCRYT_DATA_SIZE); 163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE && SMP_DEBUG_VERBOSE == TRUE 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p_out->param_buf, (const UINT8 *)"Encrypted text", SMP_ENCRYT_KEY_SIZE); 165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->param_len = SMP_ENCRYT_KEY_SIZE; 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->status = HCI_SUCCESS; 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_out->opcode = HCI_BLE_ENCRYPT; 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 171abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_start); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_passkey 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate passkey. 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_passkey(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1875cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 1885cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 190444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_TK; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_proc_passkey 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to process a passkey. 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_proc_passkey(tSMP_CB *p_cb , tBTM_RAND_ENC *p) 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *tt = p_cb->tk; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 210ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT32 passkey; /* 19655 test number; */ 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp = p->param_buf; 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT32(passkey, pp); 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey &= ~SMP_PASSKEY_MASK; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* truncate by maximum value */ 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (passkey > BTM_MAX_PASSKEY_VAL) 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project passkey >>= 1; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the TK */ 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_cb->tk, 0, BT_OCTET16_LEN); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_STREAM(tt, passkey); 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_TK; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p_cb->tk; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->p_callback) 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda, (tSMP_EVT_DATA *)&passkey); 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->selected_association_model == SMP_MODEL_SEC_CONN_PASSKEY_DISP) 234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &passkey); 236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 239444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_KEY_READY_EVT, (tSMP_INT_DATA *)&key); 240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_stk 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate STK calculated by running 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AES with the TK value as key and a concatenation of the random 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** values. 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_generate_stk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2565cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_ENC output; 259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->le_secure_connections_mode_is_used) 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("FOR LE SC LTK IS USED INSTEAD OF STK"); 266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output.param_len = SMP_ENCRYT_KEY_SIZE; 267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output.status = HCI_SUCCESS; 268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output.opcode = HCI_BLE_ENCRYPT; 269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(output.param_buf, p_cb->ltk, SMP_ENCRYT_DATA_SIZE); 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (!smp_calculate_legacy_short_term_key(p_cb, &output)) 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_stk(p_cb, &output); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_srand_mrand_confirm 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to start the second pairing phase by 286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** start generating random number. 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_generate_srand_mrand_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2945cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 2955cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_SRAND_MRAND; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_rand_cont 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate another 64 bits random for 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** MRand or Srand. 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_generate_rand_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3155cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 3165cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_SRAND_MRAND_CONT; 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate 64 MSB of MRand or SRand */ 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_ltk 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called: 329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in legacy pairing - to calculate LTK, starting with DIV 330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** generation; 331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LE Secure Connections pairing over LE transport - to process LTK 332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** already generated to encrypt LE link; 333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LE Secure Connections pairing over BR/EDR transport - to start 334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** BR/EDR Link Key processing. 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_ltk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3415cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN div_status; 344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (smp_get_br_state() == SMP_BR_STATE_BOND_PENDING) 346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 347444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_br_process_link_key(p_cb, NULL); 348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (p_cb->le_secure_connections_mode_is_used) 351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_secure_connection_long_term_key(); 353444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (div_status) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_ltk_cont(p_cb, NULL); 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 364b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("Generate DIV for LTK"); 365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_DIV_LTK; 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate MRand or SRand */ 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_compute_csrk 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate CSRK 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_compute_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(p_data); 385444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 er; 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 buffer[4]; /* for (r || DIV) r=1*/ 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 r=1; 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p=buffer; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 393b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_compute_csrk div=%x", p_cb->div); 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceEncRoot(er); 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* CSRK = d1(ER, DIV, 1) */ 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, p_cb->div); 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, r); 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output)) 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 401b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_generate_csrk failed"); 402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->smp_over_br) 403444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &status); 405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 408444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 409444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_cb->csrk, output.param_buf, BT_OCTET16_LEN); 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_send_csrk_info(p_cb, NULL); 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_csrk 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to calculate CSRK, starting with DIV 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generation. 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4315cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN div_status; 434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 435b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_csrk"); 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div); 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (div_status) 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_compute_csrk(p_cb, NULL); 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 444b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("Generate DIV for CSRK"); 445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_DIV_CSRK; 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_concatenate_peer 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** add pairing command sent from local device into p1. 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_concatenate_local( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code) 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_data; 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, op_code); 461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_cb->local_io_capability); 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_oob_flag); 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_auth_req); 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->loc_enc_size); 465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_cb->local_i_key); 466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, p_cb->local_r_key); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data = p; 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_concatenate_peer 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** add pairing command received from peer device into p1. 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_concatenate_peer( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code) 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = *p_data; 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 479b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_concatenate_peer "); 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, op_code); 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_io_caps); 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_oob_flag); 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_auth_req); 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_enc_size); 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_i_key); 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8_TO_STREAM(p, p_cb->peer_r_key); 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_data = p; 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_gen_p1_4_confirm 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Generate Confirm/Compare Step1: 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p1 = pres || preq || rat' || iat' 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_gen_p1_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p1) 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = (UINT8 *)p1; 504ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type = 0; 505ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BD_ADDR remote_bda; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 507b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_gen_p1_4_confirm"); 508ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 509ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 511b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("can not generate confirm for unknown device"); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 515ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BTM_ReadConnectionAddr( p_cb->pairing_bda, p_cb->local_bda, &p_cb->addr_type); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->role == HCI_ROLE_MASTER) 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : rat': initiator's(local) address type */ 520ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, p_cb->addr_type); 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : iat': responder's address type */ 522ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, addr_type); 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate preq */ 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_REQ); 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate pres */ 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_RSP); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : iat': initiator's address type */ 531ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, addr_type); 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB : rat': responder's(local) address type */ 533ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8_TO_STREAM(p, p_cb->addr_type); 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate preq */ 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_REQ); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* concatinate pres */ 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_RSP); 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 540b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("p1 = pres || preq || rat' || iat'"); 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1", 16); 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 544444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_gen_p2_4_confirm 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Generate Confirm/Compare Step2: 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p2 = padding || ia || ra 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_gen_p2_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p2) 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 557ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta UINT8 *p = (UINT8 *)p2; 558ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BD_ADDR remote_bda; 559ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta tBLE_ADDR_TYPE addr_type = 0; 560ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 561ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type)) 562ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 563b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("can not generate confirm p2 for unknown device"); 564ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return; 565ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 567b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_gen_p2_4_confirm"); 568ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p, 0, sizeof(BT_OCTET16)); 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_cb->role == HCI_ROLE_MASTER) 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB ra */ 574ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BDADDR_TO_STREAM(p, remote_bda); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ia */ 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->local_bda); 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LSB ra */ 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BDADDR_TO_STREAM(p, p_cb->local_bda); 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ia */ 583ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta BDADDR_TO_STREAM(p, remote_bda); 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 586b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("p2 = padding || ia || ra"); 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian(p2, (const UINT8 *)"p2", 16); 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 590444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_calculate_comfirm 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to calculate Confirm value. 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_calculate_comfirm (tSMP_CB *p_cb, BT_OCTET16 rand, BD_ADDR bda) 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 602444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(bda); 603444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 p1; 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 608b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_calculate_comfirm "); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate p1 = pres || preq || rat' || iat' */ 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_gen_p1_4_confirm(p_cb, p1); 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p1 = rand XOR p1 */ 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_xor_128(p1, rand); 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1' = r XOR p1", 16); 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate e(k, r XOR p1), where k = TK */ 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output)) 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 620b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_generate_csrk failed"); 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm_cont(p_cb, &output); 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 628444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_calculate_comfirm_cont 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when SConfirm/MConfirm is generated 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the Confirm request/response to peer device. 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_calculate_comfirm_cont(tSMP_CB *p_cb, tSMP_ENC *p) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 p2; 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 645b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_calculate_comfirm_cont "); 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if SMP_DEBUG == TRUE 647b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("Confirm step 1 p1' = e(k, r XOR p1) Generated"); 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"C1", 16); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_gen_p2_4_confirm(p_cb, p2); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate p2 = (p1' XOR p2) */ 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_xor_128(p2, p->param_buf); 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p2, (const UINT8 *)"p2' = C1 xor p2", 16); 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate: Confirm = E(k, p1' XOR p2) */ 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output)) 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 660b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_calculate_comfirm_cont failed"); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 665444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->rand_enc_proc_state) 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_CONFIRM: 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_confirm(p_cb, &output); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SMP_GEN_COMPARE: 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_compare(p_cb, &output); 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 677444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 680444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_confirm 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when a 48 bits random number is generated 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** as SRand or MRand, continue to calculate Sconfirm or MConfirm. 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 688444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_generate_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6905cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 6915cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 692444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 693444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_CONFIRM; 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rand, (const UINT8 *)"local rand", 16); 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm(p_cb, p_cb->rand, p_cb->pairing_bda); 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 697444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_compare 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to generate SConfirm for Slave device, 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or MSlave for Master device. This function can be also used for 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** generating Compare number for confirm value check. 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid smp_generate_compare (tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7115cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_data); 7125cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 713b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_compare "); 714444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_COMPARE; 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rrand, (const UINT8 *)"peer rand", 16); 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_calculate_comfirm(p_cb, p_cb->rrand, p_cb->local_bda); 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 718444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_confirm 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when SConfirm/MConfirm is generated 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the Confirm request/response to peer device. 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_confirm(tSMP_CB *p_cb, tSMP_ENC *p) 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 733444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_cb->confirm, p->param_buf, BT_OCTET16_LEN); 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 737b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("Confirm Generated"); 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->confirm, (const UINT8 *)"Confirm", 16); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_CFM; 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 745444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_compare 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when Compare is generated using the 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RRand and local BDA, TK information. 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_compare(tSMP_CB *p_cb, tSMP_ENC *p) 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 760b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_process_compare "); 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 762b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG("Compare Generated"); 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"Compare", 16); 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_CMP; 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_process_stk 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when STK is generated 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** proceed to send the encrypt the link using STK. 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_stk(tSMP_CB *p_cb, tSMP_ENC *p) 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_process_stk "); 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SMP_DEBUG == TRUE) 787b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("STK Generated"); 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_mask_enc_key(p_cb->loc_enc_size, p->param_buf); 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_STK; 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 799444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_generate_ltk_cont 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to calculate LTK = d1(ER, DIV, 0)= e(ER, DIV) 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 806444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_generate_ltk_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(p_data); 809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 er; 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceEncRoot(er); 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* LTK = d1(ER, DIV, 0)= e(ER, DIV)*/ 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(er, BT_OCTET16_LEN, (UINT8 *)&p_cb->div, 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(UINT16), &output)) 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* mask the LTK */ 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_mask_enc_key(p_cb->loc_enc_size, output.param_buf); 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((void *)p_cb->ltk, output.param_buf, BT_OCTET16_LEN); 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_generate_rand_vector(p_cb, NULL); 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_y 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to proceed generate Y = E(DHK, Rand) 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_y(tSMP_CB *p_cb, tSMP_INT_DATA *p) 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UNUSED(p); 845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET16 dhk; 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_ENC output; 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 851b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_y "); 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_GetDeviceDHK(dhk); 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, p_cb->enc_rand, 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_OCTET8_LEN, &output)) 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 857b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("smp_generate_y failed"); 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_process_ediv(p_cb, &output); 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function smp_generate_rand_vector 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called when LTK is generated, send state machine 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** event to SMP. 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p) 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8785cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p); 8795cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate EDIV and rand now */ 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* generate random vector */ 882b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_generate_rand_vector "); 883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_RAND_V; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_rand_back(NULL); 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 887444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_process_ediv 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is to calculate EDIV = Y xor DIV 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void smp_process_ediv(tSMP_CB *p_cb, tSMP_ENC *p) 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSMP_KEY key; 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pp= p->param_buf; 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 y; 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 903b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_DEBUG ("smp_process_ediv "); 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(y, pp); 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* EDIV = Y xor DIV */ 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cb->ediv = p_cb->div ^ y; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send LTK ready */ 909b44cc59d286ad255e872c60df02e032bd8d9d75bSharvil Nanavati SMP_TRACE_ERROR("LTK ready"); 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.key_type = SMP_KEY_TYPE_LTK; 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project key.p_data = p->param_buf; 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key); 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 918444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_legacy_short_term_key 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 920444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates legacy STK. 921444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 922444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 923444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 924444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 925444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_legacy_short_term_key(tSMP_CB *p_cb, tSMP_ENC *output) 926444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 927444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 ptext; 928444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = ptext; 929444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 930444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memset(p, 0, BT_OCTET16_LEN); 932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_MASTER) 933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 934444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p, p_cb->rand, BT_OCTET8_LEN); 935444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(&p[BT_OCTET8_LEN], p_cb->rrand, BT_OCTET8_LEN); 936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 939444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p, p_cb->rrand, BT_OCTET8_LEN); 940444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(&p[BT_OCTET8_LEN], p_cb->rand, BT_OCTET8_LEN); 941444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 943444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN encrypted; 944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* generate STK = Etk(rand|rrand)*/ 945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji encrypted = SMP_Encrypt( p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, output); 946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!encrypted) 947444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 948444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 949444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return encrypted; 951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_create_private_key 956444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 957444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called to create private key used to 958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** calculate public key and DHKey. 959444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The function starts private key creation requesting controller 960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** to generate [0-7] octets of private key. 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 965444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_create_private_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 967444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s",__FUNCTION__); 968444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_0_7; 969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 970444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 971444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 973444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 974444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 975444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_use_oob_private_key 976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 977444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is called 978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - to save the secret key used to calculate the public key used 979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** in calculations of commitment sent OOB to a peer 980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - to use this secret key to recalculate the public key and 981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** start the process of sending this public key to the peer 982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** if secret/public keys have to be reused. 983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** If the keys aren't supposed to be reused, continue from the 984444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** point from which request for OOB data was issued. 985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 988444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_use_oob_private_key(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 991444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s req_oob_type: %d, role: %d", 992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, p_cb->req_oob_type, p_cb->role); 993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->req_oob_type) 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_OOB_BOTH: 997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_OOB_LOCAL: 998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s restore secret key", __func__) 999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->private_key, p_cb->sc_oob_data.loc_oob_data.private_key_used, BT_OCTET32_LEN); 1000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_private_key(p_cb); 1001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s create secret key anew", __func__); 1004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_set_state(SMP_STATE_PAIR_REQ_RSP); 1005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_decide_association_model(p_cb, NULL); 1006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_continue_private_key_creation 1013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is used to continue private key creation. 1015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_continue_private_key_creation (tSMP_CB *p_cb, tBTM_RAND_ENC *p) 1020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 state = p_cb->rand_enc_proc_state & ~0x80; 1022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s state=0x%x", __func__, state); 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (state) 1025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_0_7: 1027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)p_cb->private_key, p->param_buf, p->param_len); 1028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_8_15; 1029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 1030444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 1031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_8_15: 1034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->private_key[8], p->param_buf, p->param_len); 1035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_16_23; 1036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 1037444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 1038444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1039444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_16_23: 1041444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->private_key[16], p->param_buf, p->param_len); 1042444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GENERATE_PRIVATE_KEY_24_31; 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_24_31: 1048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->private_key[24], p->param_buf, p->param_len); 1049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_private_key (p_cb); 1050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1053444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1056444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1059444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_process_private_key 1062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function processes private key. 1064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** It calculates public key and notifies SM that private key / 1065444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** public key pair is created. 1066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_process_private_key(tSMP_CB *p_cb) 1071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji Point public_key; 1073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32 private_key; 1074444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN); 1078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ECC_PointMult(&public_key, &(curve_p256.G), (DWORD*) private_key, KEY_LENGTH_DWORDS_P256); 1079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->loc_publ_key.x, public_key.x, BT_OCTET32_LEN); 1080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->loc_publ_key.y, public_key.y, BT_OCTET32_LEN); 1081444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1082444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->private_key, (const UINT8 *)"private", 1083444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1084444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->loc_publ_key.x, (const UINT8 *)"local public(x)", 1085444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1086444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->loc_publ_key.y, (const UINT8 *)"local public(y)", 1087444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->flags |= SMP_PAIR_FLAG_HAVE_LOCAL_PUBL_KEY; 1089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_LOC_PUBL_KEY_CRTD_EVT, NULL); 1090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1092444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_compute_dhkey 1095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function: 1097444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - calculates a new public key using as input local private 1098444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** key and peer public key; 1099444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - saves the new public key x-coordinate as DHKey. 1100444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_compute_dhkey (tSMP_CB *p_cb) 1105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji Point peer_publ_key, new_publ_key; 1107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32 private_key; 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(private_key, p_cb->private_key, BT_OCTET32_LEN); 1112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(peer_publ_key.x, p_cb->peer_publ_key.x, BT_OCTET32_LEN); 1113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(peer_publ_key.y, p_cb->peer_publ_key.y, BT_OCTET32_LEN); 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ECC_PointMult(&new_publ_key, &peer_publ_key, (DWORD*) private_key, KEY_LENGTH_DWORDS_P256); 1116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->dhkey, new_publ_key.x, BT_OCTET32_LEN); 1118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->dhkey, (const UINT8 *)"Old DHKey", 1120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->private_key, (const UINT8 *)"private", 1123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->peer_publ_key.x, (const UINT8 *)"rem public(x)", 1125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->peer_publ_key.y, (const UINT8 *)"rem public(y)", 1127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_cb->dhkey, (const UINT8 *)"Reverted DHKey", 1129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32_LEN); 1130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_local_commitment 1135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves local commmitment in CB. 1137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_local_commitment(tSMP_CB *p_cb) 1142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 random_input; 1144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s", __FUNCTION__); 1146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->selected_association_model) 1148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_JUSTWORKS: 1150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_NUM_COMP: 1151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_MASTER) 1152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("local commitment calc on master is not expected \ 1153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for Just Works/Numeric Comparison models"); 1154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 0, 1155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->commitment); 1156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji random_input = smp_calculate_random_input(p_cb->local_random, p_cb->round); 1160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 1161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji random_input, p_cb->commitment); 1162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_OOB: 1164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("local commitment calc is expected for OOB model BEFORE pairing"); 1165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->loc_publ_key.x, p_cb->loc_publ_key.x, p_cb->local_random, 0, 1166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->commitment); 1167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("Association Model = %d is not used in LE SC", 1170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->selected_association_model); 1171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1174444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("local commitment calculation is completed"); 1175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_peer_commitment 1180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves peer commmitment at the 1182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** provided output buffer. 1183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1187444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_peer_commitment(tSMP_CB *p_cb, BT_OCTET16 output_buf) 1188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 ri; 1190444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1192444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1193444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (p_cb->selected_association_model) 1194444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_JUSTWORKS: 1196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_NUM_COMP: 1197444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_SLAVE) 1198444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_WARNING ("peer commitment calc on slave is not expected \ 1199444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji for Just Works/Numeric Comparison models"); 1200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, 0, 1201444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output_buf); 1202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_ENT: 1204444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_PASSKEY_DISP: 1205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ri = smp_calculate_random_input(p_cb->peer_random, p_cb->round); 1206444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, ri, 1207444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output_buf); 1208444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1209444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_MODEL_SEC_CONN_OOB: 1210444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f4(p_cb->peer_publ_key.x, p_cb->peer_publ_key.x, p_cb->peer_random, 0, 1211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji output_buf); 1212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 1213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji default: 1214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("Association Model = %d is not used in LE SC", 1215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->selected_association_model); 1216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("peer commitment calculation is completed"); 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f4 1225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 1227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** C = f4(U, V, X, Z) = AES-CMAC (U||V||Z) 1228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X 1229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: U is 256 bit, 1231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** V is 256 bit, 1232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X is 128 bit, 1233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Z is 8 bit, 1234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: C is 128 bit. 1235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1239444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_f4(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 z, UINT8 *c) 1243444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = BT_OCTET32_LEN /* U size */ + BT_OCTET32_LEN /* V size */ + 1 /* Z size */; 1245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[BT_OCTET32_LEN + BT_OCTET32_LEN + 1]; 1246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1251444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = u; 1257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"U", BT_OCTET32_LEN); 1258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = v; 1259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"V", BT_OCTET32_LEN); 1260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = x; 1261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"X", BT_OCTET16_LEN); 1262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = &z; 1263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Z", 1); 1264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8_TO_STREAM(p, z); 1268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, v, BT_OCTET32_LEN); 1269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, u, BT_OCTET32_LEN); 1270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1271444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = msg; 1272444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"M", msg_len); 1273444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1274444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1275444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1276444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, x, BT_OCTET16_LEN); 1277444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1278444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1279444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1280444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1281444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1282444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac); 1283444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1284444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1285444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES_CMAC", BT_OCTET16_LEN); 1286444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1287444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1288444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = c; 1289444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1290444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1291444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1292444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1293444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1294444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_numeric_comparison_display_number 1295444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1296444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves number to display in numeric 1297444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** comparison association mode. 1298444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1299444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1300444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1301444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1302444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_numeric_comparison_display_number(tSMP_CB *p_cb, 1303444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_INT_DATA *p_data) 1304444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1305444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 1306444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1307444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->role == HCI_ROLE_MASTER) 1308444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1309444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->number_to_display = 1310444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_g2(p_cb->loc_publ_key.x, p_cb->peer_publ_key.x, p_cb->rand, 1311444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rrand); 1312444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1313444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1314444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1315444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->number_to_display = 1316444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_g2(p_cb->peer_publ_key.x, p_cb->loc_publ_key.x, p_cb->rrand, 1317444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand); 1318444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1319444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1320444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->number_to_display >= (BTM_MAX_PASSKEY_VAL + 1)) 1321444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1322444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 reason; 1323444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji reason = p_cb->failure = SMP_PAIR_FAIL_UNKNOWN; 1324444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &reason); 1325444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1326444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1327444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1328444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT("Number to display in numeric comparison = %d", p_cb->number_to_display); 1329444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->cb_evt = SMP_NC_REQ_EVT; 1330444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_SC_DSPL_NC_EVT, &p_cb->number_to_display); 1331444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 1332444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1333444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1334444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1335444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1336444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_g2 1337444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1338444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 1339444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** g2(U, V, X, Y) = AES-CMAC (U||V||Y) mod 2**32 mod 10**6 1340444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X 1341444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** and 1342444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Vres = g2(U, V, X, Y) mod 10**6 1343444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1344444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: U is 256 bit, 1345444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** V is 256 bit, 1346444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** X is 128 bit, 1347444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Y is 128 bit, 1348444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1349444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns Vres. 1350444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Expected value has to be in the range [0 - 999999] i.e. [0 - 0xF423F]. 1351444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Vres = 1000000 means that the calculation fails. 1352444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1353444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1354444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1355444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1356444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1357444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiUINT32 smp_calculate_g2(UINT8 *u, UINT8 *v, UINT8 *x, UINT8 *y) 1358444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1359444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = BT_OCTET32_LEN /* U size */ + BT_OCTET32_LEN /* V size */ 1360444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji + BT_OCTET16_LEN /* Y size */; 1361444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[BT_OCTET32_LEN + BT_OCTET32_LEN + BT_OCTET16_LEN]; 1362444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1363444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1364444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1365444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT32 vres; 1366444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1367444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1368444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1369444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1370444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1371444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1372444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1373444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, y, BT_OCTET16_LEN); 1374444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, v, BT_OCTET32_LEN); 1375444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, u, BT_OCTET32_LEN); 1376444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1377444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = u; 1378444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"U", BT_OCTET32_LEN); 1379444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = v; 1380444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"V", BT_OCTET32_LEN); 1381444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = x; 1382444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"X", BT_OCTET16_LEN); 1383444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = y; 1384444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Y", BT_OCTET16_LEN); 1385444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1386444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1387444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1388444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, x, BT_OCTET16_LEN); 1389444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1390444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1391444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1392444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1393444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1394444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if(!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 1395444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1396444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed",__FUNCTION__); 1397444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return (BTM_MAX_PASSKEY_VAL + 1); 1398444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1399444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1400444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1401444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1402444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1403444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1404444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1405444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* vres = cmac mod 2**32 mod 10**6 */ 1406444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = &cmac[0]; 1407444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT32(vres, p); 1408444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1409444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = (UINT8 *) &vres; 1410444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"cmac mod 2**32", 4); 1411444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1412444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1413444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji while (vres > BTM_MAX_PASSKEY_VAL) 1414444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji vres -= (BTM_MAX_PASSKEY_VAL + 1); 1415444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1416444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = (UINT8 *) &vres; 1417444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"cmac mod 2**32 mod 10**6", 4); 1418444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1419444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1420444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("Value for numeric comparison = %d", vres); 1421444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return vres; 1422444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1423444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1424444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1425444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1426444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f5 1427444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1428444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function provides two AES-CMAC that are supposed to be used as 1429444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - MacKey (MacKey is used in pairing DHKey check calculation); 1430444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - LTK (LTK is used to ecrypt the link after completion of Phase 2 1431444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** and on reconnection, to derive BR/EDR LK). 1432444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The function inputs are W, N1, N2, A1, A2. 1433444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** F5 rules: 1434444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - the value used as key in MacKey/LTK (T) is calculated 1435444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** (function smp_calculate_f5_key(...)); 1436444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The formula is: 1437444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T = AES-CMAC (W) 1438444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** salt 1439444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where salt is internal parameter of smp_calculate_f5_key(...). 1440444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - MacKey and LTK are calculated as AES-MAC values received with the 1441444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** key T calculated in the previous step and the plaintext message 1442444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** built from the external parameters N1, N2, A1, A2 and the internal 1443444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** parameters counter, keyID, length. 1444444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The function smp_calculate_f5_mackey_or_long_term_key(...) is used in the 1445444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** calculations. 1446444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The same formula is used in calculation of MacKey and LTK and the 1447444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** same parameter values except the value of the internal parameter 1448444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** counter: 1449444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in MacKey calculations the value is 0; 1450444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LTK calculations the value is 1. 1451444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey = AES-CMAC (Counter=0||keyID||N1||N2||A1||A2||Length=256) 1452444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T 1453444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LTK = AES-CMAC (Counter=1||keyID||N1||N2||A1||A2||Length=256) 1454444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T 1455444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The parameters are 1456444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: 1457444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** W is 256 bits, 1458444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N1 is 128 bits, 1459444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N2 is 128 bits, 1460444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A1 is 56 bit, 1461444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A2 is 56 bit. 1462444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** internal: 1463444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Counter is 8 bits, its value is 0 for MacKey, 1464444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1 for LTK; 1465444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** KeyId is 32 bits, its value is 1466444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 0x62746c65 (MSB~LSB); 1467444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Length is 16 bits, its value is 0x0100 1468444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** (MSB~LSB). 1469444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: 1470444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey is 128 bits; 1471444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LTK is 128 bits 1472444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1473444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1474444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1475444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1476444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1477444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1478444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1479444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f5(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, 1480444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *mac_key, UINT8 *ltk) 1481444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1482444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 t; /* AES-CMAC output in smp_calculate_f5_key(...), key in */ 1483444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* smp_calculate_f5_mackey_or_long_term_key(...) */ 1484444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1485444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1486444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1487444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* internal parameters: */ 1488444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1489444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1490444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji counter is 0 for MacKey, 1491444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji is 1 for LTK 1492444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1493444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 counter_mac_key[1] = {0}; 1494444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 counter_ltk[1] = {1}; 1495444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1496444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji keyID 62746c65 1497444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1498444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key_id[4] = {0x65, 0x6c, 0x74, 0x62}; 1499444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1500444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji length 0100 1501444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1502444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 length[2] = {0x00, 0x01}; 1503444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1504444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1505444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1506444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = w; 1507444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"W", BT_OCTET32_LEN); 1508444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n1; 1509444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N1", BT_OCTET16_LEN); 1510444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n2; 1511444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N2", BT_OCTET16_LEN); 1512444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a1; 1513444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"A1", 7); 1514444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a2; 1515444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt,(const UINT8 *) "A2", 7); 1516444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1517444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1518444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!smp_calculate_f5_key(w, t)) 1519444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1520444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to calc T",__FUNCTION__); 1521444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1522444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1523444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1524444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = t; 1525444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"T", BT_OCTET16_LEN); 1526444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1527444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1528444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!smp_calculate_f5_mackey_or_long_term_key(t, counter_mac_key, key_id, n1, n2, a1, a2, 1529444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji length, mac_key)) 1530444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1531444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to calc MacKey", __FUNCTION__); 1532444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1533444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1534444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1535444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = mac_key; 1536444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"MacKey", BT_OCTET16_LEN); 1537444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1538444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1539444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!smp_calculate_f5_mackey_or_long_term_key(t, counter_ltk, key_id, n1, n2, a1, a2, 1540444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji length, ltk)) 1541444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1542444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to calc LTK",__FUNCTION__); 1543444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1544444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1545444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1546444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = ltk; 1547444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"LTK", BT_OCTET16_LEN); 1548444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1549444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1550444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return TRUE; 1551444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1552444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1553444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1554444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1555444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f5_mackey_or_long_term_key 1556444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1557444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates the value of MacKey or LTK by the rules 1558444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** defined for f5 function. 1559444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** At the moment exactly the same formula is used to calculate 1560444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LTK and MacKey. 1561444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The difference is the value of input parameter Counter: 1562444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in MacKey calculations the value is 0; 1563444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** - in LTK calculations the value is 1. 1564444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** The formula: 1565444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** mac = AES-CMAC (Counter||keyID||N1||N2||A1||A2||Length) 1566444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T 1567444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1568444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: T is 256 bits; 1569444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Counter is 8 bits, its value is 0 for MacKey, 1570444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1 for LTK; 1571444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** keyID is 32 bits, its value is 0x62746c65; 1572444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N1 is 128 bits; 1573444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N2 is 128 bits; 1574444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A1 is 56 bits; 1575444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A2 is 56 bits; 1576444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Length is 16 bits, its value is 0x0100 1577444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: LTK is 128 bit. 1578444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1579444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1580444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1581444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1582444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1583444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1584444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1585444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f5_mackey_or_long_term_key(UINT8 *t, UINT8 *counter, 1586444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *key_id, UINT8 *n1, UINT8 *n2, UINT8 *a1, UINT8 *a2, 1587444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *length, UINT8 *mac) 1588444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1589444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1590444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1591444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1592444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = 1 /* Counter size */ + 4 /* keyID size */ + 1593444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16_LEN /* N1 size */ + BT_OCTET16_LEN /* N2 size */ + 1594444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 7 /* A1 size*/ + 7 /* A2 size*/ + 2 /* Length size */; 1595444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[1 + 4 + BT_OCTET16_LEN + BT_OCTET16_LEN + 7 + 7 + 2]; 1596444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1597444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1598444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1599444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1600444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1601444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1602444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1603444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = t; 1604444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"T", BT_OCTET16_LEN); 1605444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = counter; 1606444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Counter", 1); 1607444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key_id; 1608444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"KeyID", 4); 1609444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n1; 1610444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N1", BT_OCTET16_LEN); 1611444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = n2; 1612444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"N2", BT_OCTET16_LEN); 1613444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a1; 1614444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"A1", 7); 1615444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = a2; 1616444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"A2", 7); 1617444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = length; 1618444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"Length", 2); 1619444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1620444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1621444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1622444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, t, BT_OCTET16_LEN); 1623444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1624444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1625444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1626444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1627444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1628444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, length, 2); 1629444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a2, 7); 1630444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a1, 7); 1631444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n2, BT_OCTET16_LEN); 1632444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n1, BT_OCTET16_LEN); 1633444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, key_id, 4); 1634444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, counter, 1); 1635444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1636444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = msg; 1637444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"M", msg_len); 1638444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1639444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1640444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 1641444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1642444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __FUNCTION__); 1643444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 1644444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1645444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1646444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1647444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1648444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1649444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1650444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1651444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = mac; 1652444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1653444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1654444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1655444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1656444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1657444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1658444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f5_key 1659444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1660444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates key T used in calculation of 1661444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey and LTK (f5 output is defined as MacKey || LTK). 1662444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** T = AES-CMAC (W) 1663444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** salt 1664444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1665444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Internal: salt is 128 bit. 1666444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: W is 256 bit. 1667444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Output: T is 128 bit. 1668444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1669444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1670444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1671444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1672444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1673444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1674444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1675444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f5_key(UINT8 *w, UINT8 *t) 1676444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1677444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1678444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Please see 2.2.7 LE Secure Connections Key Generation Function f5 */ 1679444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* 1680444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji salt: 6C88 8391 AAF5 A538 6037 0BDB 5A60 83BE 1681444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji */ 1682444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 salt = { 1683444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 0xBE, 0x83, 0x60, 0x5A, 0xDB, 0x0B, 0x37, 0x60, 1684444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 0x38, 0xA5, 0xF5, 0xAA, 0x91, 0x83, 0x88, 0x6C 1685444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji }; 1686444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1687444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_prnt = NULL; 1688444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1689444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1690444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1691444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1692444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = salt; 1693444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"salt", BT_OCTET16_LEN); 1694444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = w; 1695444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"W", BT_OCTET32_LEN); 1696444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1697444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1698444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 key; 1699444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET32 msg; 1700444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1701444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1702444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, salt, BT_OCTET16_LEN); 1703444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1704444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, w, BT_OCTET32_LEN); 1705444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1706444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = key; 1707444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"K", BT_OCTET16_LEN); 1708444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = msg; 1709444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"M", BT_OCTET32_LEN); 1710444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1711444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1712444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 cmac; 1713444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1714444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!aes_cipher_msg_auth_code(key, msg, BT_OCTET32_LEN, BT_OCTET16_LEN, cmac)) 1715444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1716444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __FUNCTION__); 1717444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 1718444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1719444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1720444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1721444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_prnt = cmac; 1722444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_prnt, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1723444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1724444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1725444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = t; 1726444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1727444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1728444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1729444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1730444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1731444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1732444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_local_dhkey_check 1733444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1734444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves local device DHKey check 1735444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** value in CB. 1736444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Before doing this it calls smp_calculate_f5_mackey_and_long_term_key(...). 1737444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** to calculate MacKey and LTK. 1738444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** MacKey is used in dhkey calculation. 1739444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1740444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1741444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1742444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1743444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_local_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 1744444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1745444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 iocap[3], a[7], b[7]; 1746444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1747444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1748444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1749444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f5_mackey_and_long_term_key(p_cb); 1750444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1751444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_local_io_capabilities(iocap, p_cb); 1752444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1753444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_local_ble_address(a, p_cb); 1754444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_peer_ble_address(b, p_cb); 1755444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_calculate_f6(p_cb->mac_key, p_cb->rand, p_cb->rrand, p_cb->peer_random, iocap, a, b, 1756444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->dhkey_check); 1757444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1758444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("local DHKey check calculation is completed"); 1759444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1760444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1761444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1762444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1763444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_peer_dhkey_check 1764444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1765444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates peer device DHKey check value. 1766444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1767444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 1768444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1769444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1770444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_calculate_peer_dhkey_check(tSMP_CB *p_cb, tSMP_INT_DATA *p_data) 1771444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1772444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 iocap[3], a[7], b[7]; 1773444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 param_buf; 1774444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret; 1775444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_KEY key; 1776444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_STATUS status = SMP_PAIR_FAIL_UNKNOWN; 1777444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1778444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1779444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1780444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_peer_io_capabilities(iocap, p_cb); 1781444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1782444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_local_ble_address(a, p_cb); 1783444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_collect_peer_ble_address(b, p_cb); 1784444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_f6(p_cb->mac_key, p_cb->rrand, p_cb->rand, p_cb->local_random, iocap, 1785444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji b, a, param_buf); 1786444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1787444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (ret) 1788444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1789444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("peer DHKey check calculation is completed"); 1790444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if (SMP_DEBUG == TRUE) 1791444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (param_buf, (const UINT8 *)"peer DHKey check", 1792444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16_LEN); 1793444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1794444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji key.key_type = SMP_KEY_TYPE_PEER_DHK_CHCK; 1795444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji key.p_data = param_buf; 1796444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_SC_KEY_READY_EVT, &key); 1797444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1798444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1799444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1800444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("peer DHKey check calculation failed"); 1801444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status); 1802444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1803444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1804444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1805444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1806444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1807444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_f6 1808444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1809444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 1810444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** C = f6(W, N1, N2, R, IOcap, A1, A2) = AES-CMAC (N1||N2||R||IOcap||A1||A2) 1811444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** W 1812444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 1813444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: W is 128 bit, 1814444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N1 is 128 bit, 1815444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** N2 is 128 bit, 1816444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** R is 128 bit, 1817444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** IOcap is 24 bit, 1818444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A1 is 56 bit, 1819444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** A2 is 56 bit, 1820444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: C is 128 bit. 1821444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1822444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1823444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1824444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 1825444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 1826444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1827444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1828444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_f6(UINT8 *w, UINT8 *n1, UINT8 *n2, UINT8 *r, UINT8 *iocap, UINT8 *a1, 1829444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *a2, UINT8 *c) 1830444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1831444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 1832444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = BT_OCTET16_LEN /* N1 size */ + BT_OCTET16_LEN /* N2 size */ + 1833444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16_LEN /* R size */ + 3 /* IOcap size */ + 7 /* A1 size*/ 1834444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji + 7 /* A2 size*/; 1835444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[BT_OCTET16_LEN + BT_OCTET16_LEN + BT_OCTET16_LEN + 3 + 7 + 7]; 1836444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1837444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_print = NULL; 1838444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1839444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1840444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 1841444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1842444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = w; 1843444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"W", BT_OCTET16_LEN); 1844444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = n1; 1845444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"N1", BT_OCTET16_LEN); 1846444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = n2; 1847444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"N2", BT_OCTET16_LEN); 1848444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = r; 1849444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"R", BT_OCTET16_LEN); 1850444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = iocap; 1851444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"IOcap", 3); 1852444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = a1; 1853444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"A1", 7); 1854444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = a2; 1855444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"A2", 7); 1856444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1857444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1858444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 1859444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 1860444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1861444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 1862444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, w, BT_OCTET16_LEN); 1863444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1864444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = key; 1865444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"K", BT_OCTET16_LEN); 1866444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1867444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1868444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 1869444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a2, 7); 1870444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, a1, 7); 1871444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, iocap, 3); 1872444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, r, BT_OCTET16_LEN); 1873444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n2, BT_OCTET16_LEN); 1874444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, n1, BT_OCTET16_LEN); 1875444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1876444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = msg; 1877444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"M", msg_len); 1878444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1879444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1880444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1881444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if(!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 1882444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1883444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __FUNCTION__); 1884444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 1885444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1886444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1887444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 1888444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = cmac; 1889444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 1890444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 1891444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1892444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = c; 1893444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 1894444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1895444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1896444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1897444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 1898444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1899444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_link_key_from_long_term_key 1900444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1901444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves BR/EDR link key derived from 1902444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** LE SC LTK. 1903444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1904444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 1905444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 1906444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 1907444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_link_key_from_long_term_key(tSMP_CB *p_cb) 1908444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 1909444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec; 1910e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun BD_ADDR bda_for_lk; 1911e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun tBLE_ADDR_TYPE conn_addr_type; 1912444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1913444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __func__); 1914444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1915e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun if (p_cb->id_addr_rcvd && p_cb->id_addr_type == BLE_ADDR_PUBLIC) 1916e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 1917e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_TRACE_DEBUG ("Use rcvd identity address as BD_ADDR of LK rcvd identity address"); 1918e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun memcpy(bda_for_lk, p_cb->id_addr, BD_ADDR_LEN); 1919e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 1920e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else if ((BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda_for_lk, &conn_addr_type)) && 1921e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun conn_addr_type == BLE_ADDR_PUBLIC) 1922e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 1923e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_TRACE_DEBUG ("Use rcvd connection address as BD_ADDR of LK"); 1924e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 1925e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun else 1926e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun { 1927e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun SMP_TRACE_WARNING ("Don't have peer public address to associate with LK"); 1928e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun return FALSE; 1929e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun } 1930e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun 1931444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) 1932444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1933444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to find Security Record", __func__); 1934444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1935444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1936444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1937444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 intermediate_link_key; 1938444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 1939444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1940444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(p_cb->ltk, (UINT8 *)"1pmt" /* reversed "tmp1" */,intermediate_link_key); 1941444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 1942444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1943444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to derive intermediate_link_key", __func__); 1944444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1945444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1946444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1947444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 link_key; 1948444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(intermediate_link_key, (UINT8 *) "rbel" /* reversed "lebr" */, link_key); 1949444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 1950444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1951444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed", __func__); 1952444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1953444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1954444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1955444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 link_key_type; 1956444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (btm_cb.security_mode == BTM_SEC_MODE_SC) 1957444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1958444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* Secure Connections Only Mode */ 1959444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_AUTH_COMB_P_256; 1960444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1961444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (controller_get_interface()->supports_secure_connections()) 1962444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1963444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* both transports are SC capable */ 1964444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) 1965444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_AUTH_COMB_P_256; 1966444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1967444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB_P_256; 1968444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1969444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else if (btm_cb.security_mode == BTM_SEC_MODE_SP) 1970444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1971444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* BR/EDR transport is SSP capable */ 1972444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p_cb->sec_level == SMP_SEC_AUTHENTICATED) 1973444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_AUTH_COMB; 1974444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1975444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type = BTM_LKEY_TYPE_UNAUTH_COMB; 1976444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1977444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 1978444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 1979444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR ("%s failed to update link_key. Sec Mode = %d, sm4 = 0x%02x", 1980444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __func__, btm_cb.security_mode, p_dev_rec->sm4); 1981444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 1982444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1983444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1984444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji link_key_type += BTM_LTK_DERIVED_LKEY_OFFSET; 1985444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1986444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p; 1987444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 notif_link_key; 1988444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = notif_link_key; 1989444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY16_TO_STREAM(p, link_key); 1990444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1991e28055315f96c0d06e73a66a9bb06df85247b5a7Chaojing Sun btm_sec_link_key_notification (bda_for_lk, notif_link_key, link_key_type); 1992444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1993444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("%s is completed", __func__); 1994444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 1995444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1996444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 1997444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 1998444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 1999444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2000444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2001444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_long_term_key_from_link_key 2002444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2003444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates and saves SC LTK derived from BR/EDR 2004444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** link key. 2005444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2006444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 2007444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2008444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2009444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_long_term_key_from_link_key(tSMP_CB *p_cb) 2010444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2011444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 2012444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tBTM_SEC_DEV_REC *p_dev_rec; 2013444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 rev_link_key[16]; 2014444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2015444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s", __FUNCTION__); 2016444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2017444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((p_dev_rec = btm_find_dev (p_cb->pairing_bda)) == NULL) 2018444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2019444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to find Security Record",__FUNCTION__); 2020444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 2021444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2022444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2023444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 br_link_key_type; 2024444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((br_link_key_type = BTM_SecGetDeviceLinkKeyType (p_cb->pairing_bda)) 2025444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji == BTM_LKEY_TYPE_IGNORE) 2026444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2027444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to retrieve BR link type",__FUNCTION__); 2028444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 2029444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2030444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2031444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if ((br_link_key_type != BTM_LKEY_TYPE_AUTH_COMB_P_256) && 2032444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji (br_link_key_type != BTM_LKEY_TYPE_UNAUTH_COMB_P_256)) 2033444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2034444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s LE SC LTK can't be derived from LK %d", 2035444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji __FUNCTION__, br_link_key_type); 2036444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return FALSE; 2037444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2038444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2039444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p1; 2040444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p2; 2041444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p1 = rev_link_key; 2042444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p2 = p_dev_rec->link_key; 2043444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji REVERSE_ARRAY_TO_STREAM(p1, p2, 16); 2044444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2045444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BT_OCTET16 intermediate_long_term_key; 2046444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* "tmp2" obtained from the spec */ 2047444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(rev_link_key, (UINT8 *) "2pmt" /* reversed "tmp2" */, 2048444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji intermediate_long_term_key); 2049444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2050444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 2051444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2052444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed to derive intermediate_long_term_key",__FUNCTION__); 2053444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 2054444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2055444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2056444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji /* "brle" obtained from the spec */ 2057444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = smp_calculate_h6(intermediate_long_term_key, (UINT8 *) "elrb" /* reversed "brle" */, 2058444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->ltk); 2059444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2060444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!ret) 2061444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2062444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed",__FUNCTION__); 2063444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2064444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji else 2065444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2066444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->sec_level = (br_link_key_type == BTM_LKEY_TYPE_AUTH_COMB_P_256) 2067444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ? SMP_SEC_AUTHENTICATED : SMP_SEC_UNAUTHENTICATE; 2068444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_EVENT ("%s is completed",__FUNCTION__); 2069444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2070444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2071444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 2072444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2073444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2074444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2075444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2076444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_calculate_h6 2077444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2078444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description The function calculates 2079444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** C = h6(W, KeyID) = AES-CMAC (KeyID) 2080444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** W 2081444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** where 2082444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** input: W is 128 bit, 2083444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** KeyId is 32 bit, 2084444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** output: C is 128 bit. 2085444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2086444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns FALSE if out of resources, TRUE in other cases. 2087444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2088444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Note The LSB is the first octet, the MSB is the last octet of 2089444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** the AES-CMAC input/output stream. 2090444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2091444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2092444a8da807abaf5f9e813ce70c56a79160495fb3Satya CallojiBOOLEAN smp_calculate_h6(UINT8 *w, UINT8 *keyid, UINT8 *c) 2093444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2094444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2095444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p_print = NULL; 2096444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2097444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2098444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s",__FUNCTION__); 2099444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2100444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = w; 2101444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"W", BT_OCTET16_LEN); 2102444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = keyid; 2103444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"keyID", 4); 2104444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2105444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2106444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *p = NULL; 2107444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 key[BT_OCTET16_LEN]; 2108444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2109444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = key; 2110444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, w, BT_OCTET16_LEN); 2111444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2112444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2113444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = key; 2114444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"K", BT_OCTET16_LEN); 2115444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2116444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2117444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg_len = 4 /* KeyID size */; 2118444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 msg[4]; 2119444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2120444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = msg; 2121444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, keyid, 4); 2122444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2123444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2124444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = msg; 2125444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print,(const UINT8 *) "M", msg_len); 2126444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2127444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2128444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji BOOLEAN ret = TRUE; 2129444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 cmac[BT_OCTET16_LEN]; 2130444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!aes_cipher_msg_auth_code(key, msg, msg_len, BT_OCTET16_LEN, cmac)) 2131444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2132444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s failed",__FUNCTION__); 2133444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ret = FALSE; 2134444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2135444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2136444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if SMP_DEBUG == TRUE 2137444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_print = cmac; 2138444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_debug_print_nbyte_little_endian (p_print, (const UINT8 *)"AES-CMAC", BT_OCTET16_LEN); 2139444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif 2140444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2141444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p = c; 2142444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji ARRAY_TO_STREAM(p, cmac, BT_OCTET16_LEN); 2143444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return ret; 2144444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2145444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2146444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2147444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2148444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_start_nonce_generation 2149444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2150444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function starts nonce generation. 2151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2154444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2155444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_start_nonce_generation(tSMP_CB *p_cb) 2156444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2157444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s", __FUNCTION__); 2158444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_NONCE_0_7; 2159444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 2160444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 2161444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2162444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2163444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2164444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2165444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_finish_nonce_generation 2166444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2167444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function finishes nonce generation. 2168444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2169444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2170444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2171444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2172444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_finish_nonce_generation(tSMP_CB *p_cb) 2173444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2174444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG("%s", __FUNCTION__); 2175444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji p_cb->rand_enc_proc_state = SMP_GEN_NONCE_8_15; 2176444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (!btsnd_hcic_ble_rand((void *)smp_rand_back)) 2177444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_rand_back(NULL); 2178444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2179444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2180444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2181444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2182444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_process_new_nonce 2183444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2184444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function notifies SM that it has new nonce. 2185444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2186444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2187444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2188444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2189444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojivoid smp_process_new_nonce(tSMP_CB *p_cb) 2190444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2191444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s round %d", __FUNCTION__, p_cb->round); 2192444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_HAVE_LOC_NONCE_EVT, NULL); 2193444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2194444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2195444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji/******************************************************************************* 2196444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2197444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Function smp_rand_back 2198444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2199444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Description This function is to process the rand command finished, 2200444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** process the random/encrypted number for further action. 2201444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2202444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** Returns void 2203444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji** 2204444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji*******************************************************************************/ 2205444a8da807abaf5f9e813ce70c56a79160495fb3Satya Callojistatic void smp_rand_back(tBTM_RAND_ENC *p) 2206444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji{ 2207444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji tSMP_CB *p_cb = &smp_cb; 2208444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 *pp = p->param_buf; 2209444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 failure = SMP_PAIR_FAIL_UNKNOWN; 2210444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji UINT8 state = p_cb->rand_enc_proc_state & ~0x80; 2211444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2212444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_DEBUG ("%s state=0x%x", __FUNCTION__, state); 2213444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji if (p && p->status == HCI_SUCCESS) 2214444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2215444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji switch (state) 2216444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji { 2217444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_SRAND_MRAND: 2218444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)p_cb->rand, p->param_buf, p->param_len); 2219444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_rand_cont(p_cb, NULL); 2220444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2221444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2222444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_SRAND_MRAND_CONT: 2223444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); 2224444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_confirm(p_cb, NULL); 2225444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2226444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2227444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_DIV_LTK: 2228444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT16(p_cb->div, pp); 2229444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_ltk_cont(p_cb, NULL); 2230444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2231444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2232444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_DIV_CSRK: 2233444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji STREAM_TO_UINT16(p_cb->div, pp); 2234444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_compute_csrk(p_cb, NULL); 2235444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2236444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2237444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_TK: 2238444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_proc_passkey(p_cb, p); 2239444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2240444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2241444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_RAND_V: 2242444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy(p_cb->enc_rand, p->param_buf, BT_OCTET8_LEN); 2243444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_generate_y(p_cb, NULL); 2244444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2245444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2246444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_0_7: 2247444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_8_15: 2248444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_16_23: 2249444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GENERATE_PRIVATE_KEY_24_31: 2250444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_continue_private_key_creation(p_cb, p); 2251444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2252444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2253444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_NONCE_0_7: 2254444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)p_cb->rand, p->param_buf, p->param_len); 2255444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_finish_nonce_generation(p_cb); 2256444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2257444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2258444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji case SMP_GEN_NONCE_8_15: 2259444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len); 2260444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_process_new_nonce(p_cb); 2261444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji break; 2262444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2263444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2264444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji return; 2265444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji } 2266444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 2267444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji SMP_TRACE_ERROR("%s key generation failed: (%d)", __FUNCTION__, p_cb->rand_enc_proc_state); 2268444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure); 2269444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji} 2270444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji 22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2273