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