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