Home | History | Annotate | Download | only in smp
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2008-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This file contains the implementation of the SMP utility functions used
     22  *  by SMP.
     23  *
     24  ******************************************************************************/
     25 
     26 #include "bt_target.h"
     27 #include "bt_utils.h"
     28 
     29 #if SMP_INCLUDED == TRUE
     30     #if SMP_DEBUG == TRUE
     31         #include <stdio.h>
     32     #endif
     33     #include <string.h>
     34 
     35     #include "btm_ble_api.h"
     36     #include "smp_int.h"
     37     #include "btm_int.h"
     38     #include "btm_ble_int.h"
     39     #include "hcimsgs.h"
     40     #include "aes.h"
     41     #ifndef SMP_MAX_ENC_REPEAT
     42         #define SMP_MAX_ENC_REPEAT      3
     43     #endif
     44 
     45 static void smp_rand_back(tBTM_RAND_ENC *p);
     46 static void smp_genenrate_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
     47 static void smp_genenrate_ltk_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data);
     48 static void smp_generate_y(tSMP_CB *p_cb, tSMP_INT_DATA *p);
     49 static void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p);
     50 static void smp_process_stk(tSMP_CB *p_cb, tSMP_ENC *p);
     51 static void smp_calculate_comfirm_cont(tSMP_CB *p_cb, tSMP_ENC *p);
     52 static void smp_process_confirm(tSMP_CB *p_cb, tSMP_ENC *p);
     53 static void smp_process_compare(tSMP_CB *p_cb, tSMP_ENC *p);
     54 static void smp_process_ediv(tSMP_CB *p_cb, tSMP_ENC *p);
     55 
     56 static const tSMP_ACT smp_encrypt_action[] =
     57 {
     58     smp_generate_compare,           /* SMP_GEN_COMPARE */
     59     smp_genenrate_confirm,          /* SMP_GEN_CONFIRM*/
     60     smp_generate_stk,               /* SMP_GEN_STK*/
     61     smp_genenrate_ltk_cont,          /* SMP_GEN_LTK */
     62     smp_generate_ltk,               /* SMP_GEN_DIV_LTK */
     63     smp_generate_rand_vector,        /* SMP_GEN_RAND_V */
     64     smp_generate_y,                  /* SMP_GEN_EDIV */
     65     smp_generate_passkey,           /* SMP_GEN_TK */
     66     smp_generate_confirm,           /* SMP_GEN_SRAND_MRAND */
     67     smp_genenrate_rand_cont         /* SMP_GEN_SRAND_MRAND_CONT */
     68 };
     69 
     70 
     71     #define SMP_PASSKEY_MASK    0xfff00000
     72 
     73     #if SMP_DEBUG == TRUE
     74 static void smp_debug_print_nbyte_little_endian (UINT8 *p, const UINT8 *key_name, UINT8 len)
     75 {
     76     int     i, x = 0;
     77     UINT8   p_buf[100];
     78     memset(p_buf, 0, 100);
     79 
     80     for (i = 0; i < len; i ++)
     81     {
     82         x += sprintf ((char *)&p_buf[x], "%02x ", p[i]);
     83     }
     84     SMP_TRACE_DEBUG("%s(LSB ~ MSB) = %s", key_name, p_buf);
     85 }
     86     #else
     87         #define smp_debug_print_nbyte_little_endian(p, key_name, len)
     88     #endif
     89 
     90 /*******************************************************************************
     91 **
     92 ** Function         smp_encrypt_data
     93 **
     94 ** Description      This function is called to generate passkey.
     95 **
     96 ** Returns          void
     97 **
     98 *******************************************************************************/
     99 BOOLEAN smp_encrypt_data (UINT8 *key, UINT8 key_len,
    100                           UINT8 *plain_text, UINT8 pt_len,
    101                           tSMP_ENC *p_out)
    102 {
    103     aes_context     ctx;
    104     UINT8           *p_start = NULL;
    105     UINT8           *p = NULL;
    106     UINT8           *p_rev_data = NULL;    /* input data in big endilan format */
    107     UINT8           *p_rev_key = NULL;     /* input key in big endilan format */
    108     UINT8           *p_rev_output = NULL;  /* encrypted output in big endilan format */
    109 
    110     SMP_TRACE_DEBUG ("smp_encrypt_data");
    111     if ( (p_out == NULL ) || (key_len != SMP_ENCRYT_KEY_SIZE) )
    112     {
    113         BTM_TRACE_ERROR ("smp_encrypt_data Failed");
    114         return(FALSE);
    115     }
    116 
    117     if ((p_start = (UINT8 *)GKI_getbuf((SMP_ENCRYT_DATA_SIZE*4))) == NULL)
    118     {
    119         BTM_TRACE_ERROR ("smp_encrypt_data Failed unable to allocate buffer");
    120         return(FALSE);
    121     }
    122 
    123     if (pt_len > SMP_ENCRYT_DATA_SIZE)
    124         pt_len = SMP_ENCRYT_DATA_SIZE;
    125 
    126     memset(p_start, 0, SMP_ENCRYT_DATA_SIZE * 4);
    127     p = p_start;
    128     ARRAY_TO_STREAM (p, plain_text, pt_len); /* byte 0 to byte 15 */
    129     p_rev_data = p = p_start + SMP_ENCRYT_DATA_SIZE; /* start at byte 16 */
    130     REVERSE_ARRAY_TO_STREAM (p, p_start, SMP_ENCRYT_DATA_SIZE);  /* byte 16 to byte 31 */
    131     p_rev_key = p; /* start at byte 32 */
    132     REVERSE_ARRAY_TO_STREAM (p, key, SMP_ENCRYT_KEY_SIZE); /* byte 32 to byte 47 */
    133 
    134     smp_debug_print_nbyte_little_endian(key, (const UINT8 *)"Key", SMP_ENCRYT_KEY_SIZE);
    135     smp_debug_print_nbyte_little_endian(p_start, (const UINT8 *)"Plain text", SMP_ENCRYT_DATA_SIZE);
    136     p_rev_output = p;
    137     aes_set_key(p_rev_key, SMP_ENCRYT_KEY_SIZE, &ctx);
    138     aes_encrypt(p_rev_data, p, &ctx);  /* outputs in byte 48 to byte 63 */
    139 
    140     p = p_out->param_buf;
    141     REVERSE_ARRAY_TO_STREAM (p, p_rev_output, SMP_ENCRYT_DATA_SIZE);
    142     smp_debug_print_nbyte_little_endian(p_out->param_buf, (const UINT8 *)"Encrypted text", SMP_ENCRYT_KEY_SIZE);
    143 
    144     p_out->param_len = SMP_ENCRYT_KEY_SIZE;
    145     p_out->status = HCI_SUCCESS;
    146     p_out->opcode =  HCI_BLE_ENCRYPT;
    147 
    148     GKI_freebuf(p_start);
    149 
    150     return(TRUE);
    151 }
    152 
    153 
    154 /*******************************************************************************
    155 **
    156 ** Function         smp_generate_passkey
    157 **
    158 ** Description      This function is called to generate passkey.
    159 **
    160 ** Returns          void
    161 **
    162 *******************************************************************************/
    163 void smp_generate_passkey(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    164 {
    165     UNUSED(p_data);
    166 
    167     SMP_TRACE_DEBUG ("smp_generate_passkey");
    168     p_cb->rand_enc_proc = SMP_GEN_TK;
    169 
    170     /* generate MRand or SRand */
    171     if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
    172         smp_rand_back(NULL);
    173 }
    174 /*******************************************************************************
    175 **
    176 ** Function         smp_proc_passkey
    177 **
    178 ** Description      This function is called to process a passkey.
    179 **
    180 ** Returns          void
    181 **
    182 *******************************************************************************/
    183 void smp_proc_passkey(tSMP_CB *p_cb , tBTM_RAND_ENC *p)
    184 {
    185     UINT8   *tt = p_cb->tk;
    186     tSMP_KEY    key;
    187     UINT32  passkey; /* 19655 test number; */
    188     UINT8 *pp = p->param_buf;
    189 
    190     SMP_TRACE_DEBUG ("smp_proc_passkey ");
    191     STREAM_TO_UINT32(passkey, pp);
    192     passkey &= ~SMP_PASSKEY_MASK;
    193 
    194     /* truncate by maximum value */
    195     while (passkey > BTM_MAX_PASSKEY_VAL)
    196         passkey >>= 1;
    197 
    198     /* save the TK */
    199     memset(p_cb->tk, 0, BT_OCTET16_LEN);
    200     UINT32_TO_STREAM(tt, passkey);
    201 
    202     key.key_type = SMP_KEY_TYPE_TK;
    203     key.p_data  = p_cb->tk;
    204 
    205     if (p_cb->p_callback)
    206     {
    207         (*p_cb->p_callback)(SMP_PASSKEY_NOTIF_EVT, p_cb->pairing_bda, (tSMP_EVT_DATA *)&passkey);
    208     }
    209 
    210     smp_sm_event(p_cb, SMP_KEY_READY_EVT, (tSMP_INT_DATA *)&key);
    211 }
    212 
    213 
    214 /*******************************************************************************
    215 **
    216 ** Function         smp_generate_stk
    217 **
    218 ** Description      This function is called to generate STK calculated by running
    219 **                  AES with the TK value as key and a concatenation of the random
    220 **                  values.
    221 **
    222 ** Returns          void
    223 **
    224 *******************************************************************************/
    225 void smp_generate_stk (tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    226 {
    227     BT_OCTET16      ptext;
    228     UINT8           *p = ptext;
    229     tSMP_ENC        output;
    230     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
    231     UNUSED(p_data);
    232 
    233     SMP_TRACE_DEBUG ("smp_generate_stk ");
    234 
    235     memset(p, 0, BT_OCTET16_LEN);
    236     if (p_cb->role == HCI_ROLE_MASTER)
    237     {
    238         memcpy(p, p_cb->rand, BT_OCTET8_LEN);
    239         memcpy(&p[BT_OCTET8_LEN], p_cb->rrand, BT_OCTET8_LEN);
    240     }
    241     else
    242     {
    243         memcpy(p, p_cb->rrand, BT_OCTET8_LEN);
    244         memcpy(&p[BT_OCTET8_LEN], p_cb->rand, BT_OCTET8_LEN);
    245     }
    246 
    247     /* generate STK = Etk(rand|rrand)*/
    248     if (!SMP_Encrypt( p_cb->tk, BT_OCTET16_LEN, ptext, BT_OCTET16_LEN, &output))
    249     {
    250         SMP_TRACE_ERROR("smp_generate_stk failed");
    251         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
    252     }
    253     else
    254     {
    255         smp_process_stk(p_cb, &output);
    256     }
    257 
    258 }
    259 /*******************************************************************************
    260 **
    261 ** Function         smp_generate_confirm
    262 **
    263 ** Description      This function is called to start the second pairing phase by
    264 **                  start generating initializer random number.
    265 **
    266 **
    267 ** Returns          void
    268 **
    269 *******************************************************************************/
    270 void smp_generate_confirm (tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    271 {
    272     UNUSED(p_data);
    273 
    274     SMP_TRACE_DEBUG ("smp_generate_confirm");
    275     p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND;
    276     /* generate MRand or SRand */
    277     if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
    278         smp_rand_back(NULL);
    279 }
    280 /*******************************************************************************
    281 **
    282 ** Function         smp_genenrate_rand_cont
    283 **
    284 ** Description      This function is called to generate another 64 bits random for
    285 **                  MRand or Srand.
    286 **
    287 ** Returns          void
    288 **
    289 *******************************************************************************/
    290 void smp_genenrate_rand_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    291 {
    292     UNUSED(p_data);
    293 
    294     SMP_TRACE_DEBUG ("smp_genenrate_rand_cont ");
    295     p_cb->rand_enc_proc = SMP_GEN_SRAND_MRAND_CONT;
    296     /* generate 64 MSB of MRand or SRand */
    297 
    298     if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
    299         smp_rand_back(NULL);
    300 }
    301 /*******************************************************************************
    302 **
    303 ** Function         smp_generate_ltk
    304 **
    305 ** Description      This function is called to calculate LTK, starting with DIV
    306 **                  generation.
    307 **
    308 **
    309 ** Returns          void
    310 **
    311 *******************************************************************************/
    312 void smp_generate_ltk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    313 {
    314     BOOLEAN     div_status;
    315     UNUSED(p_data);
    316 
    317     SMP_TRACE_DEBUG ("smp_generate_ltk ");
    318 
    319     div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
    320 
    321     if (div_status)
    322     {
    323         smp_genenrate_ltk_cont(p_cb, NULL);
    324     }
    325     else
    326     {
    327         SMP_TRACE_DEBUG ("Generate DIV for LTK");
    328         p_cb->rand_enc_proc = SMP_GEN_DIV_LTK;
    329         /* generate MRand or SRand */
    330         if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
    331             smp_rand_back(NULL);
    332     }
    333 }
    334 
    335 
    336 /*******************************************************************************
    337 **
    338 ** Function         smp_compute_csrk
    339 **
    340 ** Description      This function is called to calculate CSRK
    341 **
    342 **
    343 ** Returns          void
    344 **
    345 *******************************************************************************/
    346 void smp_compute_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    347 {
    348     BT_OCTET16  er;
    349     UINT8       buffer[4]; /* for (r || DIV)  r=1*/
    350     UINT16      r=1;
    351     UINT8       *p=buffer;
    352     tSMP_ENC    output;
    353     tSMP_STATUS   status = SMP_PAIR_FAIL_UNKNOWN;
    354     UNUSED(p_data);
    355 
    356     SMP_TRACE_DEBUG ("smp_compute_csrk div=%x", p_cb->div);
    357     BTM_GetDeviceEncRoot(er);
    358     /* CSRK = d1(ER, DIV, 1) */
    359     UINT16_TO_STREAM(p, p_cb->div);
    360     UINT16_TO_STREAM(p, r);
    361 
    362     if (!SMP_Encrypt(er, BT_OCTET16_LEN, buffer, 4, &output))
    363     {
    364         SMP_TRACE_ERROR("smp_generate_csrk failed");
    365         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
    366     }
    367     else
    368     {
    369         memcpy((void *)p_cb->csrk, output.param_buf, BT_OCTET16_LEN);
    370         smp_send_csrk_info(p_cb, NULL);
    371     }
    372 }
    373 
    374 /*******************************************************************************
    375 **
    376 ** Function         smp_generate_csrk
    377 **
    378 ** Description      This function is called to calculate LTK, starting with DIV
    379 **                  generation.
    380 **
    381 **
    382 ** Returns          void
    383 **
    384 *******************************************************************************/
    385 void smp_generate_csrk(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    386 {
    387     BOOLEAN     div_status;
    388     UNUSED(p_data);
    389 
    390     SMP_TRACE_DEBUG ("smp_generate_csrk");
    391 
    392     div_status = btm_get_local_div(p_cb->pairing_bda, &p_cb->div);
    393     if (div_status)
    394     {
    395         smp_compute_csrk(p_cb, NULL);
    396     }
    397     else
    398     {
    399         SMP_TRACE_DEBUG ("Generate DIV for CSRK");
    400         p_cb->rand_enc_proc = SMP_GEN_DIV_CSRK;
    401         if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
    402             smp_rand_back(NULL);
    403     }
    404 }
    405 
    406 
    407 /*******************************************************************************
    408 ** Function         smp_concatenate_peer
    409 **                  add pairing command sent from local device into p1.
    410 *******************************************************************************/
    411 void smp_concatenate_local( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code)
    412 {
    413     UINT8   *p = *p_data;
    414 
    415     SMP_TRACE_DEBUG ("smp_concatenate_local ");
    416     UINT8_TO_STREAM(p, op_code);
    417     UINT8_TO_STREAM(p, p_cb->loc_io_caps);
    418     UINT8_TO_STREAM(p, p_cb->loc_oob_flag);
    419     UINT8_TO_STREAM(p, p_cb->loc_auth_req);
    420     UINT8_TO_STREAM(p, p_cb->loc_enc_size);
    421     UINT8_TO_STREAM(p, p_cb->loc_i_key);
    422     UINT8_TO_STREAM(p, p_cb->loc_r_key);
    423 
    424     *p_data = p;
    425 }
    426 /*******************************************************************************
    427 ** Function         smp_concatenate_peer
    428 **                  add pairing command received from peer device into p1.
    429 *******************************************************************************/
    430 void smp_concatenate_peer( tSMP_CB *p_cb, UINT8 **p_data, UINT8 op_code)
    431 {
    432     UINT8   *p = *p_data;
    433 
    434     SMP_TRACE_DEBUG ("smp_concatenate_peer ");
    435     UINT8_TO_STREAM(p, op_code);
    436     UINT8_TO_STREAM(p, p_cb->peer_io_caps);
    437     UINT8_TO_STREAM(p, p_cb->peer_oob_flag);
    438     UINT8_TO_STREAM(p, p_cb->peer_auth_req);
    439     UINT8_TO_STREAM(p, p_cb->peer_enc_size);
    440     UINT8_TO_STREAM(p, p_cb->peer_i_key);
    441     UINT8_TO_STREAM(p, p_cb->peer_r_key);
    442 
    443     *p_data = p;
    444 }
    445 /*******************************************************************************
    446 **
    447 ** Function         smp_gen_p1_4_confirm
    448 **
    449 ** Description      Generate Confirm/Compare Step1:
    450 **                  p1 = pres || preq || rat' || iat'
    451 **
    452 ** Returns          void
    453 **
    454 *******************************************************************************/
    455 void smp_gen_p1_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p1)
    456 {
    457     UINT8 *p = (UINT8 *)p1;
    458     tBLE_ADDR_TYPE    addr_type = 0;
    459     BD_ADDR           remote_bda;
    460 
    461     SMP_TRACE_DEBUG ("smp_gen_p1_4_confirm");
    462 
    463     if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type))
    464     {
    465         SMP_TRACE_ERROR("can not generate confirm for unknown device");
    466         return;
    467     }
    468 
    469     BTM_ReadConnectionAddr( p_cb->pairing_bda, p_cb->local_bda, &p_cb->addr_type);
    470 
    471     if (p_cb->role == HCI_ROLE_MASTER)
    472     {
    473         /* LSB : rat': initiator's(local) address type */
    474         UINT8_TO_STREAM(p, p_cb->addr_type);
    475         /* LSB : iat': responder's address type */
    476         UINT8_TO_STREAM(p, addr_type);
    477         /* concatinate preq */
    478         smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_REQ);
    479         /* concatinate pres */
    480         smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_RSP);
    481     }
    482     else
    483     {
    484         /* LSB : iat': initiator's address type */
    485         UINT8_TO_STREAM(p, addr_type);
    486         /* LSB : rat': responder's(local) address type */
    487         UINT8_TO_STREAM(p, p_cb->addr_type);
    488         /* concatinate preq */
    489         smp_concatenate_peer(p_cb, &p, SMP_OPCODE_PAIRING_REQ);
    490         /* concatinate pres */
    491         smp_concatenate_local(p_cb, &p, SMP_OPCODE_PAIRING_RSP);
    492     }
    493 #if SMP_DEBUG == TRUE
    494     SMP_TRACE_DEBUG("p1 = pres || preq || rat' || iat'");
    495     smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1", 16);
    496 #endif
    497 }
    498 /*******************************************************************************
    499 **
    500 ** Function         smp_gen_p2_4_confirm
    501 **
    502 ** Description      Generate Confirm/Compare Step2:
    503 **                  p2 = padding || ia || ra
    504 **
    505 ** Returns          void
    506 **
    507 *******************************************************************************/
    508 void smp_gen_p2_4_confirm( tSMP_CB *p_cb, BT_OCTET16 p2)
    509 {
    510     UINT8       *p = (UINT8 *)p2;
    511     BD_ADDR     remote_bda;
    512     tBLE_ADDR_TYPE  addr_type = 0;
    513 
    514     if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, remote_bda, &addr_type))
    515     {
    516         SMP_TRACE_ERROR("can not generate confirm p2 for unknown device");
    517         return;
    518     }
    519 
    520     SMP_TRACE_DEBUG ("smp_gen_p2_4_confirm");
    521 
    522     memset(p, 0, sizeof(BT_OCTET16));
    523 
    524     if (p_cb->role == HCI_ROLE_MASTER)
    525     {
    526         /* LSB ra */
    527         BDADDR_TO_STREAM(p, remote_bda);
    528         /* ia */
    529         BDADDR_TO_STREAM(p, p_cb->local_bda);
    530     }
    531     else
    532     {
    533         /* LSB ra */
    534         BDADDR_TO_STREAM(p, p_cb->local_bda);
    535         /* ia */
    536         BDADDR_TO_STREAM(p, remote_bda);
    537     }
    538 #if SMP_DEBUG == TRUE
    539     SMP_TRACE_DEBUG("p2 = padding || ia || ra");
    540     smp_debug_print_nbyte_little_endian(p2, (const UINT8 *)"p2", 16);
    541 #endif
    542 }
    543 /*******************************************************************************
    544 **
    545 ** Function         smp_calculate_comfirm
    546 **
    547 ** Description      This function is called to calculate Confirm value.
    548 **
    549 ** Returns          void
    550 **
    551 *******************************************************************************/
    552 void smp_calculate_comfirm (tSMP_CB *p_cb, BT_OCTET16 rand, BD_ADDR bda)
    553 {
    554     BT_OCTET16      p1;
    555     tSMP_ENC       output;
    556     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
    557     UNUSED(bda);
    558 
    559     SMP_TRACE_DEBUG ("smp_calculate_comfirm ");
    560     /* generate p1 = pres || preq || rat' || iat' */
    561     smp_gen_p1_4_confirm(p_cb, p1);
    562 
    563     /* p1 = rand XOR p1 */
    564     smp_xor_128(p1, rand);
    565 
    566     smp_debug_print_nbyte_little_endian ((UINT8 *)p1, (const UINT8 *)"P1' = r XOR p1", 16);
    567 
    568     /* calculate e(k, r XOR p1), where k = TK */
    569     if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p1, BT_OCTET16_LEN, &output))
    570     {
    571         SMP_TRACE_ERROR("smp_generate_csrk failed");
    572         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
    573     }
    574     else
    575     {
    576         smp_calculate_comfirm_cont(p_cb, &output);
    577     }
    578 }
    579 /*******************************************************************************
    580 **
    581 ** Function         smp_calculate_comfirm_cont
    582 **
    583 ** Description      This function is called when SConfirm/MConfirm is generated
    584 **                  proceed to send the Confirm request/response to peer device.
    585 **
    586 ** Returns          void
    587 **
    588 *******************************************************************************/
    589 static void smp_calculate_comfirm_cont(tSMP_CB *p_cb, tSMP_ENC *p)
    590 {
    591     BT_OCTET16    p2;
    592     tSMP_ENC      output;
    593     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
    594 
    595     SMP_TRACE_DEBUG ("smp_calculate_comfirm_cont ");
    596 #if SMP_DEBUG == TRUE
    597     SMP_TRACE_DEBUG("Confirm step 1 p1' = e(k, r XOR p1)  Generated");
    598     smp_debug_print_nbyte_little_endian (p->param_buf, (const UINT8 *)"C1", 16);
    599 #endif
    600 
    601     smp_gen_p2_4_confirm(p_cb, p2);
    602 
    603     /* calculate p2 = (p1' XOR p2) */
    604     smp_xor_128(p2, p->param_buf);
    605     smp_debug_print_nbyte_little_endian ((UINT8 *)p2, (const UINT8 *)"p2' = C1 xor p2", 16);
    606 
    607     /* calculate: Confirm = E(k, p1' XOR p2) */
    608     if (!SMP_Encrypt(p_cb->tk, BT_OCTET16_LEN, p2, BT_OCTET16_LEN, &output))
    609     {
    610         SMP_TRACE_ERROR("smp_calculate_comfirm_cont failed");
    611         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
    612     }
    613     else
    614     {
    615         switch (p_cb->rand_enc_proc)
    616         {
    617             case SMP_GEN_CONFIRM:
    618                 smp_process_confirm(p_cb, &output);
    619                 break;
    620 
    621             case SMP_GEN_COMPARE:
    622                 smp_process_compare(p_cb, &output);
    623                 break;
    624         }
    625     }
    626 }
    627 /*******************************************************************************
    628 **
    629 ** Function         smp_genenrate_confirm
    630 **
    631 ** Description      This function is called when a 48 bits random number is generated
    632 **                  as SRand or MRand, continue to calculate Sconfirm or MConfirm.
    633 **
    634 ** Returns          void
    635 **
    636 *******************************************************************************/
    637 static void smp_genenrate_confirm(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    638 {
    639     UNUSED(p_data);
    640 
    641     SMP_TRACE_DEBUG ("smp_genenrate_confirm ");
    642     p_cb->rand_enc_proc = SMP_GEN_CONFIRM;
    643 
    644     smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rand,  (const UINT8 *)"local rand", 16);
    645 
    646     smp_calculate_comfirm(p_cb, p_cb->rand, p_cb->pairing_bda);
    647 }
    648 /*******************************************************************************
    649 **
    650 ** Function         smp_generate_compare
    651 **
    652 ** Description      This function is called to generate SConfirm for Slave device,
    653 **                  or MSlave for Master device. This function can be also used for
    654 **                  generating Compare number for confirm value check.
    655 **
    656 ** Returns          void
    657 **
    658 *******************************************************************************/
    659 void smp_generate_compare (tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    660 {
    661     UNUSED(p_data);
    662 
    663     SMP_TRACE_DEBUG ("smp_generate_compare ");
    664     p_cb->rand_enc_proc = SMP_GEN_COMPARE;
    665 
    666     smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->rrand,  (const UINT8 *)"peer rand", 16);
    667 
    668     smp_calculate_comfirm(p_cb, p_cb->rrand, p_cb->local_bda);
    669 }
    670 /*******************************************************************************
    671 **
    672 ** Function         smp_process_confirm
    673 **
    674 ** Description      This function is called when SConfirm/MConfirm is generated
    675 **                  proceed to send the Confirm request/response to peer device.
    676 **
    677 ** Returns          void
    678 **
    679 *******************************************************************************/
    680 static void smp_process_confirm(tSMP_CB *p_cb, tSMP_ENC *p)
    681 {
    682     tSMP_KEY    key;
    683 
    684     SMP_TRACE_DEBUG ("smp_process_confirm ");
    685 #if SMP_CONFORMANCE_TESTING == TRUE
    686     if (p_cb->enable_test_confirm_val)
    687     {
    688         BTM_TRACE_DEBUG ("Use confirm value from script");
    689         memcpy(p_cb->confirm, p_cb->test_confirm, BT_OCTET16_LEN);
    690     }
    691     else
    692         memcpy(p_cb->confirm, p->param_buf, BT_OCTET16_LEN);
    693 #else
    694     memcpy(p_cb->confirm, p->param_buf, BT_OCTET16_LEN);
    695 #endif
    696 
    697 
    698 #if (SMP_DEBUG == TRUE)
    699     SMP_TRACE_DEBUG("Confirm  Generated");
    700     smp_debug_print_nbyte_little_endian ((UINT8 *)p_cb->confirm,  (const UINT8 *)"Confirm", 16);
    701 #endif
    702 
    703     key.key_type = SMP_KEY_TYPE_CFM;
    704     key.p_data = p->param_buf;
    705 
    706     smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
    707 }
    708 /*******************************************************************************
    709 **
    710 ** Function         smp_process_compare
    711 **
    712 ** Description      This function is called when Compare is generated using the
    713 **                  RRand and local BDA, TK information.
    714 **
    715 ** Returns          void
    716 **
    717 *******************************************************************************/
    718 static void smp_process_compare(tSMP_CB *p_cb, tSMP_ENC *p)
    719 {
    720     tSMP_KEY    key;
    721 
    722     SMP_TRACE_DEBUG ("smp_process_compare ");
    723 #if (SMP_DEBUG == TRUE)
    724     SMP_TRACE_DEBUG("Compare Generated");
    725     smp_debug_print_nbyte_little_endian (p->param_buf,  (const UINT8 *)"Compare", 16);
    726 #endif
    727     key.key_type = SMP_KEY_TYPE_CMP;
    728     key.p_data   = p->param_buf;
    729 
    730     smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
    731 }
    732 
    733 /*******************************************************************************
    734 **
    735 ** Function         smp_process_stk
    736 **
    737 ** Description      This function is called when STK is generated
    738 **                  proceed to send the encrypt the link using STK.
    739 **
    740 ** Returns          void
    741 **
    742 *******************************************************************************/
    743 static void smp_process_stk(tSMP_CB *p_cb, tSMP_ENC *p)
    744 {
    745     tSMP_KEY    key;
    746 
    747     SMP_TRACE_DEBUG ("smp_process_stk ");
    748 #if (SMP_DEBUG == TRUE)
    749     SMP_TRACE_ERROR("STK Generated");
    750 #endif
    751     smp_mask_enc_key(p_cb->loc_enc_size, p->param_buf);
    752 
    753     key.key_type = SMP_KEY_TYPE_STK;
    754     key.p_data   = p->param_buf;
    755 
    756     smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
    757 }
    758 
    759 /*******************************************************************************
    760 **
    761 ** Function         smp_genenrate_ltk_cont
    762 **
    763 ** Description      This function is to calculate LTK = d1(ER, DIV, 0)= e(ER, DIV)
    764 **
    765 ** Returns          void
    766 **
    767 *******************************************************************************/
    768 static void smp_genenrate_ltk_cont(tSMP_CB *p_cb, tSMP_INT_DATA *p_data)
    769 {
    770     BT_OCTET16  er;
    771     tSMP_ENC    output;
    772     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
    773     UNUSED(p_data);
    774 
    775     SMP_TRACE_DEBUG ("smp_genenrate_ltk_cont ");
    776     BTM_GetDeviceEncRoot(er);
    777 
    778     /* LTK = d1(ER, DIV, 0)= e(ER, DIV)*/
    779     if (!SMP_Encrypt(er, BT_OCTET16_LEN, (UINT8 *)&p_cb->div,
    780                      sizeof(UINT16), &output))
    781     {
    782         SMP_TRACE_ERROR("smp_genenrate_ltk_cont failed");
    783         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
    784     }
    785     else
    786     {
    787         /* mask the LTK */
    788         smp_mask_enc_key(p_cb->loc_enc_size, output.param_buf);
    789         memcpy((void *)p_cb->ltk, output.param_buf, BT_OCTET16_LEN);
    790         smp_generate_rand_vector(p_cb, NULL);
    791     }
    792 
    793 }
    794 
    795 /*******************************************************************************
    796 **
    797 ** Function         smp_generate_y
    798 **
    799 ** Description      This function is to proceed generate Y = E(DHK, Rand)
    800 **
    801 ** Returns          void
    802 **
    803 *******************************************************************************/
    804 static void smp_generate_y(tSMP_CB *p_cb, tSMP_INT_DATA *p)
    805 {
    806     BT_OCTET16  dhk;
    807     tSMP_ENC   output;
    808     tSMP_STATUS     status = SMP_PAIR_FAIL_UNKNOWN;
    809     UNUSED(p);
    810 
    811     SMP_TRACE_DEBUG ("smp_generate_y ");
    812     BTM_GetDeviceDHK(dhk);
    813 
    814     if (!SMP_Encrypt(dhk, BT_OCTET16_LEN, p_cb->enc_rand,
    815                      BT_OCTET8_LEN, &output))
    816     {
    817         SMP_TRACE_ERROR("smp_generate_y failed");
    818         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &status);
    819     }
    820     else
    821     {
    822         smp_process_ediv(p_cb, &output);
    823     }
    824 }
    825 /*******************************************************************************
    826 **
    827 ** Function         smp_generate_rand_vector
    828 **
    829 ** Description      This function is called when LTK is generated, send state machine
    830 **                  event to SMP.
    831 **
    832 ** Returns          void
    833 **
    834 *******************************************************************************/
    835 static void smp_generate_rand_vector (tSMP_CB *p_cb, tSMP_INT_DATA *p)
    836 {
    837     UNUSED(p);
    838 
    839     /* generate EDIV and rand now */
    840     /* generate random vector */
    841     SMP_TRACE_DEBUG ("smp_generate_rand_vector ");
    842     p_cb->rand_enc_proc = SMP_GEN_RAND_V;
    843     if (!btsnd_hcic_ble_rand((void *)smp_rand_back))
    844         smp_rand_back(NULL);
    845 
    846 }
    847 /*******************************************************************************
    848 **
    849 ** Function         smp_genenrate_smp_process_edivltk_cont
    850 **
    851 ** Description      This function is to calculate EDIV = Y xor DIV
    852 **
    853 ** Returns          void
    854 **
    855 *******************************************************************************/
    856 static void smp_process_ediv(tSMP_CB *p_cb, tSMP_ENC *p)
    857 {
    858     tSMP_KEY    key;
    859     UINT8 *pp= p->param_buf;
    860     UINT16  y;
    861 
    862     SMP_TRACE_DEBUG ("smp_process_ediv ");
    863     STREAM_TO_UINT16(y, pp);
    864 
    865     /* EDIV = Y xor DIV */
    866     p_cb->ediv = p_cb->div ^ y;
    867     /* send LTK ready */
    868     SMP_TRACE_ERROR("LTK ready");
    869     key.key_type = SMP_KEY_TYPE_LTK;
    870     key.p_data   = p->param_buf;
    871 
    872     smp_sm_event(p_cb, SMP_KEY_READY_EVT, &key);
    873 }
    874 
    875 /*******************************************************************************
    876 **
    877 ** Function         smp_rand_back
    878 **
    879 ** Description      This function is to process the rand command finished,
    880 **                  process the random/encrypted number for further action.
    881 **
    882 ** Returns          void
    883 **
    884 *******************************************************************************/
    885 static void smp_rand_back(tBTM_RAND_ENC *p)
    886 {
    887     tSMP_CB *p_cb = &smp_cb;
    888     UINT8   *pp = p->param_buf;
    889     UINT8   failure = SMP_PAIR_FAIL_UNKNOWN;
    890     UINT8   state = p_cb->rand_enc_proc & ~0x80;
    891 
    892     SMP_TRACE_DEBUG ("smp_rand_back state=0x%x", state);
    893     if (p && p->status == HCI_SUCCESS)
    894     {
    895         switch (state)
    896         {
    897 
    898             case SMP_GEN_SRAND_MRAND:
    899                 memcpy((void *)p_cb->rand, p->param_buf, p->param_len);
    900                 smp_genenrate_rand_cont(p_cb, NULL);
    901                 break;
    902 
    903             case SMP_GEN_SRAND_MRAND_CONT:
    904                 memcpy((void *)&p_cb->rand[8], p->param_buf, p->param_len);
    905                 smp_genenrate_confirm(p_cb, NULL);
    906                 break;
    907 
    908             case SMP_GEN_DIV_LTK:
    909                 STREAM_TO_UINT16(p_cb->div, pp);
    910                 smp_genenrate_ltk_cont(p_cb, NULL);
    911                 break;
    912 
    913             case SMP_GEN_DIV_CSRK:
    914                 STREAM_TO_UINT16(p_cb->div, pp);
    915                 smp_compute_csrk(p_cb, NULL);
    916                 break;
    917 
    918             case SMP_GEN_TK:
    919                 smp_proc_passkey(p_cb, p);
    920                 break;
    921 
    922             case SMP_GEN_RAND_V:
    923                 memcpy(p_cb->enc_rand, p->param_buf, BT_OCTET8_LEN);
    924                 smp_generate_y(p_cb, NULL);
    925                 break;
    926 
    927         }
    928 
    929         return;
    930     }
    931 
    932     SMP_TRACE_ERROR("smp_rand_back Key generation failed: (%d)", p_cb->rand_enc_proc);
    933 
    934     smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
    935 
    936 }
    937 #endif
    938 
    939