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