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