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