Home | History | Annotate | Download | only in smp
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 1999-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 functions for the SMP L2CAP utility functions
     22  *
     23  ******************************************************************************/
     24 #include "bt_target.h"
     25 
     26 #if SMP_INCLUDED == TRUE
     27 
     28 #include "bt_types.h"
     29 #include "bt_utils.h"
     30 #include <string.h>
     31 #include <ctype.h>
     32 #include "hcidefs.h"
     33 #include "btm_ble_api.h"
     34 #include "l2c_api.h"
     35 #include "l2c_int.h"
     36 #include "smp_int.h"
     37 #include "device/include/controller.h"
     38 #include "btm_int.h"
     39 
     40 #define SMP_PAIRING_REQ_SIZE    7
     41 #define SMP_CONFIRM_CMD_SIZE    (BT_OCTET16_LEN + 1)
     42 #define SMP_RAND_CMD_SIZE       (BT_OCTET16_LEN + 1)
     43 #define SMP_INIT_CMD_SIZE       (BT_OCTET16_LEN + 1)
     44 #define SMP_ENC_INFO_SIZE       (BT_OCTET16_LEN + 1)
     45 #define SMP_MASTER_ID_SIZE      (BT_OCTET8_LEN + 2 + 1)
     46 #define SMP_ID_INFO_SIZE        (BT_OCTET16_LEN + 1)
     47 #define SMP_ID_ADDR_SIZE        (BD_ADDR_LEN + 1 + 1)
     48 #define SMP_SIGN_INFO_SIZE      (BT_OCTET16_LEN + 1)
     49 #define SMP_PAIR_FAIL_SIZE      2
     50 #define SMP_SECURITY_REQUEST_SIZE  2
     51 #define SMP_PAIR_PUBL_KEY_SIZE  (1 /* opcode */ + (2*BT_OCTET32_LEN))
     52 #define SMP_PAIR_COMMITM_SIZE           (1 /* opcode */ + BT_OCTET16_LEN /*Commitment*/)
     53 #define SMP_PAIR_DHKEY_CHECK_SIZE       (1 /* opcode */ + BT_OCTET16_LEN /*DHKey Check*/)
     54 #define SMP_PAIR_KEYPR_NOTIF_SIZE       (1 /* opcode */ + 1 /*Notif Type*/)
     55 
     56 /* SMP command sizes per spec */
     57 static const UINT8 smp_cmd_size_per_spec[] =
     58 {
     59     0,
     60     SMP_PAIRING_REQ_SIZE,       /* 0x01: pairing request */
     61     SMP_PAIRING_REQ_SIZE,       /* 0x02: pairing response */
     62     SMP_CONFIRM_CMD_SIZE,       /* 0x03: pairing confirm */
     63     SMP_RAND_CMD_SIZE,          /* 0x04: pairing random */
     64     SMP_PAIR_FAIL_SIZE,         /* 0x05: pairing failed */
     65     SMP_ENC_INFO_SIZE,          /* 0x06: encryption information */
     66     SMP_MASTER_ID_SIZE,         /* 0x07: master identification */
     67     SMP_ID_INFO_SIZE,           /* 0x08: identity information */
     68     SMP_ID_ADDR_SIZE,           /* 0x09: identity address information */
     69     SMP_SIGN_INFO_SIZE,         /* 0x0A: signing information */
     70     SMP_SECURITY_REQUEST_SIZE,  /* 0x0B: security request */
     71     SMP_PAIR_PUBL_KEY_SIZE,     /* 0x0C: pairing public key */
     72     SMP_PAIR_DHKEY_CHECK_SIZE,  /* 0x0D: pairing dhkey check */
     73     SMP_PAIR_KEYPR_NOTIF_SIZE,  /* 0x0E: pairing keypress notification */
     74     SMP_PAIR_COMMITM_SIZE       /* 0x0F: pairing commitment */
     75 };
     76 
     77 static BOOLEAN smp_parameter_unconditionally_valid(tSMP_CB *p_cb);
     78 static BOOLEAN smp_parameter_unconditionally_invalid(tSMP_CB *p_cb);
     79 
     80 /* type for SMP command length validation functions */
     81 typedef BOOLEAN (*tSMP_CMD_LEN_VALID)(tSMP_CB *p_cb);
     82 
     83 static BOOLEAN smp_command_has_valid_fixed_length(tSMP_CB *p_cb);
     84 
     85 static const tSMP_CMD_LEN_VALID smp_cmd_len_is_valid[] =
     86 {
     87     smp_parameter_unconditionally_invalid,
     88     smp_command_has_valid_fixed_length, /* 0x01: pairing request */
     89     smp_command_has_valid_fixed_length, /* 0x02: pairing response */
     90     smp_command_has_valid_fixed_length, /* 0x03: pairing confirm */
     91     smp_command_has_valid_fixed_length, /* 0x04: pairing random */
     92     smp_command_has_valid_fixed_length, /* 0x05: pairing failed */
     93     smp_command_has_valid_fixed_length, /* 0x06: encryption information */
     94     smp_command_has_valid_fixed_length, /* 0x07: master identification */
     95     smp_command_has_valid_fixed_length, /* 0x08: identity information */
     96     smp_command_has_valid_fixed_length, /* 0x09: identity address information */
     97     smp_command_has_valid_fixed_length, /* 0x0A: signing information */
     98     smp_command_has_valid_fixed_length, /* 0x0B: security request */
     99     smp_command_has_valid_fixed_length, /* 0x0C: pairing public key */
    100     smp_command_has_valid_fixed_length, /* 0x0D: pairing dhkey check */
    101     smp_command_has_valid_fixed_length, /* 0x0E: pairing keypress notification */
    102     smp_command_has_valid_fixed_length  /* 0x0F: pairing commitment */
    103 };
    104 
    105 /* type for SMP command parameter ranges validation functions */
    106 typedef BOOLEAN (*tSMP_CMD_PARAM_RANGES_VALID)(tSMP_CB *p_cb);
    107 
    108 static BOOLEAN smp_pairing_request_response_parameters_are_valid(tSMP_CB *p_cb);
    109 static BOOLEAN smp_pairing_keypress_notification_is_valid(tSMP_CB *p_cb);
    110 
    111 static const tSMP_CMD_PARAM_RANGES_VALID smp_cmd_param_ranges_are_valid[] =
    112 {
    113     smp_parameter_unconditionally_invalid,
    114     smp_pairing_request_response_parameters_are_valid, /* 0x01: pairing request */
    115     smp_pairing_request_response_parameters_are_valid, /* 0x02: pairing response */
    116     smp_parameter_unconditionally_valid, /* 0x03: pairing confirm */
    117     smp_parameter_unconditionally_valid, /* 0x04: pairing random */
    118     smp_parameter_unconditionally_valid, /* 0x05: pairing failed */
    119     smp_parameter_unconditionally_valid, /* 0x06: encryption information */
    120     smp_parameter_unconditionally_valid, /* 0x07: master identification */
    121     smp_parameter_unconditionally_valid, /* 0x08: identity information */
    122     smp_parameter_unconditionally_valid, /* 0x09: identity address information */
    123     smp_parameter_unconditionally_valid, /* 0x0A: signing information */
    124     smp_parameter_unconditionally_valid, /* 0x0B: security request */
    125     smp_parameter_unconditionally_valid, /* 0x0C: pairing public key */
    126     smp_parameter_unconditionally_valid, /* 0x0D: pairing dhkey check */
    127     smp_pairing_keypress_notification_is_valid, /* 0x0E: pairing keypress notification */
    128     smp_parameter_unconditionally_valid /* 0x0F: pairing commitment */
    129 };
    130 
    131 /* type for action functions */
    132 typedef BT_HDR * (*tSMP_CMD_ACT)(UINT8 cmd_code, tSMP_CB *p_cb);
    133 
    134 static BT_HDR *smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    135 static BT_HDR *smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    136 static BT_HDR *smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    137 static BT_HDR *smp_build_pairing_fail(UINT8 cmd_code, tSMP_CB *p_cb);
    138 static BT_HDR *smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    139 static BT_HDR *smp_build_encrypt_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    140 static BT_HDR *smp_build_security_request(UINT8 cmd_code, tSMP_CB *p_cb);
    141 static BT_HDR *smp_build_signing_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    142 static BT_HDR *smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    143 static BT_HDR *smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    144 static BT_HDR *smp_build_pair_public_key_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    145 static BT_HDR *smp_build_pairing_commitment_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    146 static BT_HDR *smp_build_pair_dhkey_check_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    147 static BT_HDR *smp_build_pairing_keypress_notification_cmd(UINT8 cmd_code, tSMP_CB *p_cb);
    148 
    149 static const tSMP_CMD_ACT smp_cmd_build_act[] =
    150 {
    151     NULL,
    152     smp_build_pairing_cmd,          /* 0x01: pairing request */
    153     smp_build_pairing_cmd,          /* 0x02: pairing response */
    154     smp_build_confirm_cmd,          /* 0x03: pairing confirm */
    155     smp_build_rand_cmd,             /* 0x04: pairing random */
    156     smp_build_pairing_fail,         /* 0x05: pairing failure */
    157     smp_build_encrypt_info_cmd,     /* 0x06: encryption information */
    158     smp_build_master_id_cmd,        /* 0x07: master identification */
    159     smp_build_identity_info_cmd,    /* 0x08: identity information */
    160     smp_build_id_addr_cmd,          /* 0x09: identity address information */
    161     smp_build_signing_info_cmd,     /* 0x0A: signing information */
    162     smp_build_security_request,     /* 0x0B: security request */
    163     smp_build_pair_public_key_cmd,  /* 0x0C: pairing public key */
    164     smp_build_pair_dhkey_check_cmd, /* 0x0D: pairing DHKey check */
    165     smp_build_pairing_keypress_notification_cmd, /* 0x0E: pairing keypress notification */
    166     smp_build_pairing_commitment_cmd /* 0x0F: pairing commitment */
    167 };
    168 
    169 static const UINT8 smp_association_table[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] =
    170 {
    171     /* display only */    /* Display Yes/No */   /* keyboard only */
    172                        /* No Input/Output */ /* keyboard display */
    173 
    174      /* initiator */
    175      /* model = tbl[peer_io_caps][loc_io_caps] */
    176      /* Display Only */
    177     {{SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY,
    178                                  SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY},
    179 
    180      /* Display Yes/No */
    181      {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY,
    182                                  SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY},
    183 
    184      /* Keyboard only */
    185      {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY,
    186                            SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF},
    187 
    188      /* No Input No Output */
    189      {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY,
    190                                  SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY},
    191 
    192      /* keyboard display */
    193      {SMP_MODEL_KEY_NOTIF, SMP_MODEL_KEY_NOTIF, SMP_MODEL_PASSKEY,
    194                            SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF}},
    195 
    196      /* responder */
    197      /* model = tbl[loc_io_caps][peer_io_caps] */
    198      /* Display Only */
    199     {{SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF,
    200                                  SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF},
    201 
    202       /* Display Yes/No */
    203      {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF,
    204                                  SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_KEY_NOTIF},
    205 
    206       /* keyboard only */
    207      {SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY,
    208                          SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY},
    209 
    210       /* No Input No Output */
    211      {SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY,
    212                                  SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_ENCRYPTION_ONLY},
    213 
    214       /* keyboard display */
    215      {SMP_MODEL_PASSKEY, SMP_MODEL_PASSKEY, SMP_MODEL_KEY_NOTIF,
    216                          SMP_MODEL_ENCRYPTION_ONLY, SMP_MODEL_PASSKEY}}
    217 };
    218 
    219 static const UINT8 smp_association_table_sc[2][SMP_IO_CAP_MAX][SMP_IO_CAP_MAX] =
    220 {
    221      /* display only */    /* Display Yes/No */   /* keyboard only */
    222                                              /* No InputOutput */  /* keyboard display */
    223 
    224      /* initiator */
    225      /* model = tbl[peer_io_caps][loc_io_caps] */
    226 
    227      /* Display Only */
    228     {{SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT,
    229                                     SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT},
    230 
    231      /* Display Yes/No */
    232      {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_ENT,
    233                                     SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP},
    234 
    235      /* keyboard only */
    236      {SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_PASSKEY_ENT,
    237                                        SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP},
    238 
    239      /* No Input No Output */
    240      {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS,
    241                                     SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS},
    242 
    243      /* keyboard display */
    244      {SMP_MODEL_SEC_CONN_PASSKEY_DISP, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_ENT,
    245                                        SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP}},
    246 
    247      /* responder */
    248      /* model = tbl[loc_io_caps][peer_io_caps] */
    249 
    250      /* Display Only */
    251     {{SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP,
    252                                     SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_DISP},
    253 
    254      /* Display Yes/No */
    255      {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_DISP,
    256                                     SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP},
    257 
    258      /* keyboard only */
    259      {SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_PASSKEY_ENT,
    260                                       SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_PASSKEY_ENT},
    261 
    262      /* No Input No Output */
    263      {SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS,
    264                                     SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_JUSTWORKS},
    265 
    266      /* keyboard display */
    267      {SMP_MODEL_SEC_CONN_PASSKEY_ENT, SMP_MODEL_SEC_CONN_NUM_COMP, SMP_MODEL_SEC_CONN_PASSKEY_DISP,
    268                        SMP_MODEL_SEC_CONN_JUSTWORKS, SMP_MODEL_SEC_CONN_NUM_COMP}}
    269 };
    270 
    271 static tSMP_ASSO_MODEL smp_select_legacy_association_model(tSMP_CB *p_cb);
    272 static tSMP_ASSO_MODEL smp_select_association_model_secure_connections(tSMP_CB *p_cb);
    273 
    274 /*******************************************************************************
    275 **
    276 ** Function         smp_send_msg_to_L2CAP
    277 **
    278 ** Description      Send message to L2CAP.
    279 **
    280 *******************************************************************************/
    281 BOOLEAN  smp_send_msg_to_L2CAP(BD_ADDR rem_bda, BT_HDR *p_toL2CAP)
    282 {
    283     UINT16 l2cap_ret;
    284     UINT16 fixed_cid = L2CAP_SMP_CID;
    285 
    286     if (smp_cb.smp_over_br)
    287     {
    288         fixed_cid = L2CAP_SMP_BR_CID;
    289     }
    290 
    291     SMP_TRACE_EVENT("%s", __FUNCTION__);
    292     smp_cb.total_tx_unacked += 1;
    293 
    294     if ((l2cap_ret = L2CA_SendFixedChnlData (fixed_cid, rem_bda, p_toL2CAP)) == L2CAP_DW_FAILED)
    295     {
    296         smp_cb.total_tx_unacked -= 1;
    297         SMP_TRACE_ERROR("SMP   failed to pass msg:0x%0x to L2CAP",
    298                          *((UINT8 *)(p_toL2CAP + 1) + p_toL2CAP->offset));
    299         return FALSE;
    300     }
    301     else
    302         return TRUE;
    303 }
    304 
    305 /*******************************************************************************
    306 **
    307 ** Function         smp_send_cmd
    308 **
    309 ** Description      send a SMP command on L2CAP channel.
    310 **
    311 *******************************************************************************/
    312 BOOLEAN smp_send_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    313 {
    314     BT_HDR *p_buf;
    315     BOOLEAN sent = FALSE;
    316     UINT8 failure = SMP_PAIR_INTERNAL_ERR;
    317     SMP_TRACE_EVENT("smp_send_cmd on l2cap cmd_code=0x%x", cmd_code);
    318     if ( cmd_code <= (SMP_OPCODE_MAX + 1 /* for SMP_OPCODE_PAIR_COMMITM */) &&
    319          smp_cmd_build_act[cmd_code] != NULL)
    320     {
    321         p_buf = (*smp_cmd_build_act[cmd_code])(cmd_code, p_cb);
    322 
    323         if (p_buf != NULL &&
    324             smp_send_msg_to_L2CAP(p_cb->pairing_bda, p_buf))
    325         {
    326             sent = TRUE;
    327 
    328             btu_stop_timer (&p_cb->rsp_timer_ent);
    329             btu_start_timer (&p_cb->rsp_timer_ent, BTU_TTYPE_SMP_PAIRING_CMD,
    330                              SMP_WAIT_FOR_RSP_TOUT);
    331         }
    332     }
    333 
    334     if (!sent)
    335     {
    336         if (p_cb->smp_over_br)
    337         {
    338             smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &failure);
    339         }
    340         else
    341         {
    342             smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
    343         }
    344     }
    345     return sent;
    346 }
    347 
    348 /*******************************************************************************
    349 **
    350 ** Function         smp_rsp_timeout
    351 **
    352 ** Description      Called when SMP wait for SMP command response timer expires
    353 **
    354 ** Returns          void
    355 **
    356 *******************************************************************************/
    357 void smp_rsp_timeout(TIMER_LIST_ENT *p_tle)
    358 {
    359     tSMP_CB   *p_cb = &smp_cb;
    360     UINT8 failure = SMP_RSP_TIMEOUT;
    361     UNUSED(p_tle);
    362 
    363     SMP_TRACE_EVENT("%s state:%d br_state:%d", __FUNCTION__, p_cb->state, p_cb->br_state);
    364 
    365     if (p_cb->smp_over_br)
    366     {
    367         smp_br_state_machine_event(p_cb, SMP_BR_AUTH_CMPL_EVT, &failure);
    368     }
    369     else
    370     {
    371         smp_sm_event(p_cb, SMP_AUTH_CMPL_EVT, &failure);
    372     }
    373 }
    374 
    375 /*******************************************************************************
    376 **
    377 ** Function         smp_build_pairing_req_cmd
    378 **
    379 ** Description      Build pairing request command.
    380 **
    381 *******************************************************************************/
    382 BT_HDR * smp_build_pairing_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    383 {
    384     BT_HDR      *p_buf = NULL ;
    385     UINT8       *p;
    386 
    387     SMP_TRACE_EVENT("smp_build_pairing_cmd");
    388     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIRING_REQ_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    389     {
    390         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    391 
    392         UINT8_TO_STREAM (p, cmd_code);
    393         UINT8_TO_STREAM (p, p_cb->local_io_capability);
    394         UINT8_TO_STREAM (p, p_cb->loc_oob_flag);
    395         UINT8_TO_STREAM (p, p_cb->loc_auth_req);
    396         UINT8_TO_STREAM (p, p_cb->loc_enc_size);
    397         UINT8_TO_STREAM (p, p_cb->local_i_key);
    398         UINT8_TO_STREAM (p, p_cb->local_r_key);
    399 
    400         p_buf->offset = L2CAP_MIN_OFFSET;
    401         /* 1B ERR_RSP op code + 1B cmd_op_code + 2B handle + 1B status */
    402         p_buf->len = SMP_PAIRING_REQ_SIZE;
    403     }
    404 
    405     return p_buf;
    406 }
    407 
    408 /*******************************************************************************
    409 **
    410 ** Function         smp_build_confirm_cmd
    411 **
    412 ** Description      Build confirm request command.
    413 **
    414 *******************************************************************************/
    415 static BT_HDR * smp_build_confirm_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    416 {
    417     BT_HDR      *p_buf = NULL ;
    418     UINT8       *p;
    419     UNUSED(cmd_code);
    420 
    421     SMP_TRACE_EVENT("smp_build_confirm_cmd");
    422     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_CONFIRM_CMD_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    423     {
    424         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    425 
    426         UINT8_TO_STREAM (p, SMP_OPCODE_CONFIRM);
    427         ARRAY_TO_STREAM (p, p_cb->confirm, BT_OCTET16_LEN);
    428 
    429         p_buf->offset = L2CAP_MIN_OFFSET;
    430         p_buf->len = SMP_CONFIRM_CMD_SIZE;
    431     }
    432 
    433     return p_buf;
    434 }
    435 /*******************************************************************************
    436 **
    437 ** Function         smp_build_rand_cmd
    438 **
    439 ** Description      Build Random command.
    440 **
    441 *******************************************************************************/
    442 static BT_HDR * smp_build_rand_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    443 {
    444     BT_HDR      *p_buf = NULL ;
    445     UINT8       *p;
    446     UNUSED(cmd_code);
    447 
    448     SMP_TRACE_EVENT("%s", __func__);
    449     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_RAND_CMD_SIZE + L2CAP_MIN_OFFSET))
    450          != NULL)
    451     {
    452         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    453 
    454         UINT8_TO_STREAM (p, SMP_OPCODE_RAND);
    455         ARRAY_TO_STREAM (p, p_cb->rand, BT_OCTET16_LEN);
    456 
    457         p_buf->offset = L2CAP_MIN_OFFSET;
    458         p_buf->len = SMP_RAND_CMD_SIZE;
    459     }
    460 
    461     return p_buf;
    462 }
    463 /*******************************************************************************
    464 **
    465 ** Function         smp_build_encrypt_info_cmd
    466 **
    467 ** Description      Build security information command.
    468 **
    469 *******************************************************************************/
    470 static BT_HDR * smp_build_encrypt_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    471 {
    472     BT_HDR      *p_buf = NULL ;
    473     UINT8       *p;
    474     UNUSED(cmd_code);
    475 
    476     SMP_TRACE_EVENT("smp_build_encrypt_info_cmd");
    477     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ENC_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    478     {
    479         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    480 
    481         UINT8_TO_STREAM (p, SMP_OPCODE_ENCRYPT_INFO);
    482         ARRAY_TO_STREAM (p, p_cb->ltk, BT_OCTET16_LEN);
    483 
    484         p_buf->offset = L2CAP_MIN_OFFSET;
    485         p_buf->len = SMP_ENC_INFO_SIZE;
    486     }
    487 
    488     return p_buf;
    489 }
    490 
    491 /*******************************************************************************
    492 **
    493 ** Function         smp_build_master_id_cmd
    494 **
    495 ** Description      Build security information command.
    496 **
    497 *******************************************************************************/
    498 static BT_HDR * smp_build_master_id_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    499 {
    500     BT_HDR      *p_buf = NULL ;
    501     UINT8       *p;
    502     UNUSED(cmd_code);
    503 
    504     SMP_TRACE_EVENT("%s", __func__);
    505 
    506     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_MASTER_ID_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    507     {
    508         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    509 
    510         UINT8_TO_STREAM (p, SMP_OPCODE_MASTER_ID);
    511         UINT16_TO_STREAM (p, p_cb->ediv);
    512         ARRAY_TO_STREAM (p, p_cb->enc_rand, BT_OCTET8_LEN);
    513 
    514         p_buf->offset = L2CAP_MIN_OFFSET;
    515         p_buf->len = SMP_MASTER_ID_SIZE;
    516     }
    517 
    518     return p_buf;
    519 }
    520 
    521 /*******************************************************************************
    522 **
    523 ** Function         smp_build_identity_info_cmd
    524 **
    525 ** Description      Build identity information command.
    526 **
    527 *******************************************************************************/
    528 static BT_HDR * smp_build_identity_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    529 {
    530     BT_HDR      *p_buf = NULL ;
    531     UINT8       *p;
    532     BT_OCTET16  irk;
    533     UNUSED(cmd_code);
    534     UNUSED(p_cb);
    535 
    536     SMP_TRACE_EVENT("smp_build_identity_info_cmd");
    537     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    538     {
    539         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    540 
    541         BTM_GetDeviceIDRoot(irk);
    542 
    543         UINT8_TO_STREAM (p, SMP_OPCODE_IDENTITY_INFO);
    544         ARRAY_TO_STREAM (p,  irk, BT_OCTET16_LEN);
    545 
    546         p_buf->offset = L2CAP_MIN_OFFSET;
    547         p_buf->len = SMP_ID_INFO_SIZE;
    548     }
    549 
    550     return p_buf;
    551 }
    552 
    553 /*******************************************************************************
    554 **
    555 ** Function         smp_build_id_addr_cmd
    556 **
    557 ** Description      Build identity address information command.
    558 **
    559 *******************************************************************************/
    560 static BT_HDR * smp_build_id_addr_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    561 {
    562     BT_HDR *p_buf = NULL;
    563     UINT8 *p;
    564 
    565     UNUSED(cmd_code);
    566     UNUSED(p_cb);
    567     SMP_TRACE_EVENT("smp_build_id_addr_cmd");
    568     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_ID_ADDR_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    569     {
    570         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    571 
    572         UINT8_TO_STREAM (p, SMP_OPCODE_ID_ADDR);
    573         UINT8_TO_STREAM (p, 0);
    574         BDADDR_TO_STREAM (p, controller_get_interface()->get_address()->address);
    575 
    576         p_buf->offset = L2CAP_MIN_OFFSET;
    577         p_buf->len = SMP_ID_ADDR_SIZE;
    578     }
    579 
    580     return p_buf;
    581 }
    582 
    583 /*******************************************************************************
    584 **
    585 ** Function         smp_build_signing_info_cmd
    586 **
    587 ** Description      Build signing information command.
    588 **
    589 *******************************************************************************/
    590 static BT_HDR * smp_build_signing_info_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    591 {
    592     BT_HDR      *p_buf = NULL ;
    593     UINT8       *p;
    594     UNUSED(cmd_code);
    595 
    596     SMP_TRACE_EVENT("smp_build_signing_info_cmd");
    597     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_SIGN_INFO_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    598     {
    599         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    600 
    601         UINT8_TO_STREAM (p, SMP_OPCODE_SIGN_INFO);
    602         ARRAY_TO_STREAM (p, p_cb->csrk, BT_OCTET16_LEN);
    603 
    604         p_buf->offset = L2CAP_MIN_OFFSET;
    605         p_buf->len = SMP_SIGN_INFO_SIZE;
    606     }
    607 
    608     return p_buf;
    609 }
    610 
    611 /*******************************************************************************
    612 **
    613 ** Function         smp_build_pairing_fail
    614 **
    615 ** Description      Build Pairing Fail command.
    616 **
    617 *******************************************************************************/
    618 static BT_HDR * smp_build_pairing_fail(UINT8 cmd_code, tSMP_CB *p_cb)
    619 {
    620     BT_HDR      *p_buf = NULL ;
    621     UINT8       *p;
    622     UNUSED(cmd_code);
    623 
    624     SMP_TRACE_EVENT("%s", __func__);
    625     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    626     {
    627         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    628 
    629         UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED);
    630         UINT8_TO_STREAM (p, p_cb->failure);
    631 
    632         p_buf->offset = L2CAP_MIN_OFFSET;
    633         p_buf->len = SMP_PAIR_FAIL_SIZE;
    634     }
    635 
    636     return p_buf;
    637 }
    638 
    639 /*******************************************************************************
    640 **
    641 ** Function         smp_build_security_request
    642 **
    643 ** Description      Build security request command.
    644 **
    645 *******************************************************************************/
    646 static BT_HDR *smp_build_security_request(UINT8 cmd_code, tSMP_CB *p_cb)
    647 {
    648     BT_HDR      *p_buf = NULL ;
    649     UINT8       *p;
    650     UNUSED(cmd_code);
    651 
    652     SMP_TRACE_EVENT("%s", __func__);
    653     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + 2 + L2CAP_MIN_OFFSET)) != NULL)
    654     {
    655         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    656 
    657         UINT8_TO_STREAM (p, SMP_OPCODE_SEC_REQ);
    658         UINT8_TO_STREAM (p,  p_cb->loc_auth_req);
    659 
    660         p_buf->offset = L2CAP_MIN_OFFSET;
    661         p_buf->len = SMP_SECURITY_REQUEST_SIZE;
    662 
    663         SMP_TRACE_EVENT("opcode=%d auth_req=0x%x",SMP_OPCODE_SEC_REQ,  p_cb->loc_auth_req );
    664     }
    665 
    666     return p_buf;
    667 
    668 }
    669 
    670 /*******************************************************************************
    671 **
    672 ** Function         smp_build_pair_public_key_cmd
    673 **
    674 ** Description      Build pairing public key command.
    675 **
    676 *******************************************************************************/
    677 static BT_HDR *smp_build_pair_public_key_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    678 {
    679     BT_HDR  *p_buf = NULL ;
    680     UINT8   *p;
    681     UINT8   publ_key[2*BT_OCTET32_LEN];
    682     UINT8   *p_publ_key = publ_key;
    683     UNUSED(cmd_code);
    684 
    685     SMP_TRACE_EVENT("%s", __FUNCTION__);
    686 
    687     memcpy(p_publ_key, p_cb->loc_publ_key.x, BT_OCTET32_LEN);
    688     memcpy(p_publ_key + BT_OCTET32_LEN, p_cb->loc_publ_key.y, BT_OCTET32_LEN);
    689 
    690     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) +
    691         SMP_PAIR_PUBL_KEY_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    692     {
    693         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    694 
    695         UINT8_TO_STREAM (p, SMP_OPCODE_PAIR_PUBLIC_KEY);
    696         ARRAY_TO_STREAM (p, p_publ_key, 2*BT_OCTET32_LEN);
    697 
    698         p_buf->offset = L2CAP_MIN_OFFSET;
    699         p_buf->len = SMP_PAIR_PUBL_KEY_SIZE;
    700     }
    701 
    702     return p_buf;
    703 }
    704 
    705 /*******************************************************************************
    706 **
    707 ** Function         smp_build_pairing_commitment_cmd
    708 **
    709 ** Description      Build pairing commitment command.
    710 **
    711 *******************************************************************************/
    712 static BT_HDR *smp_build_pairing_commitment_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    713 {
    714     BT_HDR *p_buf = NULL;
    715     UINT8 *p;
    716     UNUSED(cmd_code);
    717 
    718     SMP_TRACE_EVENT("%s", __func__);
    719     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) + SMP_PAIR_COMMITM_SIZE + L2CAP_MIN_OFFSET))
    720         != NULL)
    721     {
    722         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    723 
    724         UINT8_TO_STREAM (p, SMP_OPCODE_CONFIRM);
    725         ARRAY_TO_STREAM (p, p_cb->commitment, BT_OCTET16_LEN);
    726 
    727         p_buf->offset = L2CAP_MIN_OFFSET;
    728         p_buf->len = SMP_PAIR_COMMITM_SIZE;
    729     }
    730 
    731     return p_buf;
    732 }
    733 
    734 /*******************************************************************************
    735 **
    736 ** Function         smp_build_pair_dhkey_check_cmd
    737 **
    738 ** Description      Build pairing DHKey check command.
    739 **
    740 *******************************************************************************/
    741 static BT_HDR *smp_build_pair_dhkey_check_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    742 {
    743     BT_HDR *p_buf = NULL;
    744     UINT8 *p;
    745     UNUSED(cmd_code);
    746 
    747     SMP_TRACE_EVENT("%s", __FUNCTION__);
    748     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) +
    749         SMP_PAIR_DHKEY_CHECK_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    750     {
    751         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    752 
    753         UINT8_TO_STREAM (p, SMP_OPCODE_PAIR_DHKEY_CHECK);
    754         ARRAY_TO_STREAM (p, p_cb->dhkey_check, BT_OCTET16_LEN);
    755 
    756         p_buf->offset = L2CAP_MIN_OFFSET;
    757         p_buf->len = SMP_PAIR_DHKEY_CHECK_SIZE;
    758     }
    759 
    760     return p_buf;
    761 }
    762 
    763 /*******************************************************************************
    764 **
    765 ** Function         smp_build_pairing_keypress_notification_cmd
    766 **
    767 ** Description      Build keypress notification command.
    768 **
    769 *******************************************************************************/
    770 static BT_HDR * smp_build_pairing_keypress_notification_cmd(UINT8 cmd_code, tSMP_CB *p_cb)
    771 {
    772     BT_HDR      *p_buf = NULL ;
    773     UINT8       *p;
    774     UNUSED(cmd_code);
    775 
    776     SMP_TRACE_EVENT("%s", __FUNCTION__);
    777     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR)\
    778         + SMP_PAIR_KEYPR_NOTIF_SIZE + L2CAP_MIN_OFFSET)) != NULL)
    779     {
    780         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
    781 
    782         UINT8_TO_STREAM (p, SMP_OPCODE_PAIR_KEYPR_NOTIF);
    783         UINT8_TO_STREAM (p, p_cb->local_keypress_notification);
    784 
    785         p_buf->offset = L2CAP_MIN_OFFSET;
    786         p_buf->len = SMP_PAIR_KEYPR_NOTIF_SIZE;
    787     }
    788 
    789     return p_buf;
    790 }
    791 
    792 /*******************************************************************************
    793 **
    794 ** Function         smp_convert_string_to_tk
    795 **
    796 ** Description      This function is called to convert a 6 to 16 digits numeric
    797 **                  character string into SMP TK.
    798 **
    799 **
    800 ** Returns          void
    801 **
    802 *******************************************************************************/
    803 void smp_convert_string_to_tk(BT_OCTET16 tk, UINT32 passkey)
    804 {
    805     UINT8   *p = tk;
    806     tSMP_KEY    key;
    807     SMP_TRACE_EVENT("smp_convert_string_to_tk");
    808     UINT32_TO_STREAM(p, passkey);
    809 
    810     key.key_type    = SMP_KEY_TYPE_TK;
    811     key.p_data      = tk;
    812 
    813     smp_sm_event(&smp_cb, SMP_KEY_READY_EVT, &key);
    814 }
    815 
    816 /*******************************************************************************
    817 **
    818 ** Function         smp_mask_enc_key
    819 **
    820 ** Description      This function is called to mask off the encryption key based
    821 **                  on the maximum encryption key size.
    822 **
    823 **
    824 ** Returns          void
    825 **
    826 *******************************************************************************/
    827 void smp_mask_enc_key(UINT8 loc_enc_size, UINT8 * p_data)
    828 {
    829     SMP_TRACE_EVENT("smp_mask_enc_key");
    830     if (loc_enc_size < BT_OCTET16_LEN)
    831     {
    832         for (; loc_enc_size < BT_OCTET16_LEN; loc_enc_size ++)
    833             * (p_data + loc_enc_size) = 0;
    834     }
    835     return;
    836 }
    837 
    838 /*******************************************************************************
    839 **
    840 ** Function         smp_xor_128
    841 **
    842 ** Description      utility function to do an biteise exclusive-OR of two bit
    843 **                  strings of the length of BT_OCTET16_LEN.
    844 **
    845 ** Returns          void
    846 **
    847 *******************************************************************************/
    848 void smp_xor_128(BT_OCTET16 a, BT_OCTET16 b)
    849 {
    850     UINT8 i, *aa = a, *bb = b;
    851 
    852     SMP_TRACE_EVENT("smp_xor_128");
    853     for (i = 0; i < BT_OCTET16_LEN; i++)
    854     {
    855         aa[i] = aa[i] ^ bb[i];
    856     }
    857 }
    858 
    859 /*******************************************************************************
    860 **
    861 ** Function         smp_cb_cleanup
    862 **
    863 ** Description      Clean up SMP control block
    864 **
    865 ** Returns          void
    866 **
    867 *******************************************************************************/
    868 void smp_cb_cleanup(tSMP_CB   *p_cb)
    869 {
    870     tSMP_CALLBACK   *p_callback = p_cb->p_callback;
    871     UINT8           trace_level = p_cb->trace_level;
    872 
    873     SMP_TRACE_EVENT("smp_cb_cleanup");
    874 
    875     memset(p_cb, 0, sizeof(tSMP_CB));
    876     p_cb->p_callback = p_callback;
    877     p_cb->trace_level = trace_level;
    878 }
    879 
    880 /*******************************************************************************
    881 **
    882 ** Function         smp_remove_fixed_channel
    883 **
    884 ** Description      This function is called to remove the fixed channel
    885 **
    886 ** Returns          void
    887 **
    888 *******************************************************************************/
    889 void smp_remove_fixed_channel(tSMP_CB *p_cb)
    890 {
    891     SMP_TRACE_DEBUG("%s", __func__);
    892 
    893     if (p_cb->smp_over_br)
    894         L2CA_RemoveFixedChnl (L2CAP_SMP_BR_CID, p_cb->pairing_bda);
    895     else
    896         L2CA_RemoveFixedChnl (L2CAP_SMP_CID, p_cb->pairing_bda);
    897 }
    898 
    899 /*******************************************************************************
    900 **
    901 ** Function         smp_reset_control_value
    902 **
    903 ** Description      This function is called to reset the control block value when
    904 **                  pairing procedure finished.
    905 **
    906 **
    907 ** Returns          void
    908 **
    909 *******************************************************************************/
    910 void smp_reset_control_value(tSMP_CB *p_cb)
    911 {
    912     SMP_TRACE_EVENT("smp_reset_control_value");
    913     btu_stop_timer (&p_cb->rsp_timer_ent);
    914     p_cb->flags = 0;
    915     /* set the link idle timer to drop the link when pairing is done
    916        usually service discovery will follow authentication complete, to avoid
    917        racing condition for a link down/up, set link idle timer to be
    918        SMP_LINK_TOUT_MIN to guarantee SMP key exchange */
    919     L2CA_SetIdleTimeoutByBdAddr(p_cb->pairing_bda, SMP_LINK_TOUT_MIN, BT_TRANSPORT_LE);
    920 
    921     /* We can tell L2CAP to remove the fixed channel (if it has one) */
    922     smp_remove_fixed_channel(p_cb);
    923     smp_cb_cleanup(p_cb);
    924 }
    925 
    926 /*******************************************************************************
    927 **
    928 ** Function         smp_proc_pairing_cmpl
    929 **
    930 ** Description      This function is called to process pairing complete
    931 **
    932 **
    933 ** Returns          void
    934 **
    935 *******************************************************************************/
    936 void smp_proc_pairing_cmpl(tSMP_CB *p_cb)
    937 {
    938     tSMP_EVT_DATA   evt_data = {0};
    939     tSMP_CALLBACK   *p_callback = p_cb->p_callback;
    940     BD_ADDR         pairing_bda;
    941 
    942     SMP_TRACE_DEBUG ("smp_proc_pairing_cmpl ");
    943 
    944     evt_data.cmplt.reason = p_cb->status;
    945     evt_data.cmplt.smp_over_br = p_cb->smp_over_br;
    946 
    947     if (p_cb->status == SMP_SUCCESS)
    948         evt_data.cmplt.sec_level = p_cb->sec_level;
    949 
    950     evt_data.cmplt.is_pair_cancel  = FALSE;
    951 
    952     if (p_cb->is_pair_cancel)
    953         evt_data.cmplt.is_pair_cancel = TRUE;
    954 
    955 
    956     SMP_TRACE_DEBUG ("send SMP_COMPLT_EVT reason=0x%0x sec_level=0x%0x",
    957                       evt_data.cmplt.reason,
    958                       evt_data.cmplt.sec_level );
    959 
    960     memcpy (pairing_bda, p_cb->pairing_bda, BD_ADDR_LEN);
    961 
    962     smp_reset_control_value(p_cb);
    963 
    964     if (p_callback)
    965         (*p_callback) (SMP_COMPLT_EVT, pairing_bda, &evt_data);
    966 }
    967 
    968 /*******************************************************************************
    969 **
    970 ** Function         smp_command_has_invalid_parameters
    971 **
    972 ** Description      Checks if the received SMP command has invalid parameters i.e.
    973 **                  if the command length is valid and the command parameters are
    974 **                  inside specified range.
    975 **                  It returns TRUE if the command has invalid parameters.
    976 **
    977 ** Returns          TRUE if the command has invalid parameters, FALSE otherwise.
    978 **
    979 *******************************************************************************/
    980 BOOLEAN smp_command_has_invalid_parameters(tSMP_CB *p_cb)
    981 {
    982     UINT8 cmd_code = p_cb->rcvd_cmd_code;
    983 
    984     SMP_TRACE_DEBUG("%s for cmd code 0x%02x", __func__, cmd_code);
    985 
    986     if ((cmd_code > (SMP_OPCODE_MAX + 1 /* for SMP_OPCODE_PAIR_COMMITM */)) ||
    987         (cmd_code < SMP_OPCODE_MIN))
    988     {
    989         SMP_TRACE_WARNING("Somehow received command with the RESERVED code 0x%02x", cmd_code);
    990         return TRUE;
    991     }
    992 
    993     if (!(*smp_cmd_len_is_valid[cmd_code])(p_cb))
    994         return TRUE;
    995 
    996     if (!(*smp_cmd_param_ranges_are_valid[cmd_code])(p_cb))
    997         return TRUE;
    998 
    999     return FALSE;
   1000 }
   1001 
   1002 /*******************************************************************************
   1003 **
   1004 ** Function         smp_command_has_valid_fixed_length
   1005 **
   1006 ** Description      Checks if the received command size is equal to the size
   1007 **                  according to specs.
   1008 **
   1009 ** Returns          TRUE if the command size is as expected, FALSE otherwise.
   1010 **
   1011 ** Note             The command is expected to have fixed length.
   1012 *******************************************************************************/
   1013 BOOLEAN smp_command_has_valid_fixed_length(tSMP_CB *p_cb)
   1014 {
   1015     UINT8   cmd_code = p_cb->rcvd_cmd_code;
   1016 
   1017     SMP_TRACE_DEBUG("%s for cmd code 0x%02x", __func__, cmd_code);
   1018 
   1019     if (p_cb->rcvd_cmd_len != smp_cmd_size_per_spec[cmd_code])
   1020     {
   1021         SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with invalid length\
   1022             0x%02x (per spec the length is 0x%02x).",
   1023             cmd_code, p_cb->rcvd_cmd_len, smp_cmd_size_per_spec[cmd_code]);
   1024         return FALSE;
   1025     }
   1026 
   1027     return TRUE;
   1028 }
   1029 
   1030 /*******************************************************************************
   1031 **
   1032 ** Function         smp_pairing_request_response_parameters_are_valid
   1033 **
   1034 ** Description      Validates parameter ranges in the received SMP command
   1035 **                  pairing request or pairing response.
   1036 **                  The parameters to validate:
   1037 **                  IO capability,
   1038 **                  OOB data flag,
   1039 **                  Bonding_flags in AuthReq
   1040 **                  Maximum encryption key size.
   1041 **                  Returns FALSE if at least one of these parameters is out of range.
   1042 **
   1043 *******************************************************************************/
   1044 BOOLEAN smp_pairing_request_response_parameters_are_valid(tSMP_CB *p_cb)
   1045 {
   1046     UINT8   io_caps = p_cb->peer_io_caps;
   1047     UINT8   oob_flag = p_cb->peer_oob_flag;
   1048     UINT8   bond_flag = p_cb->peer_auth_req & 0x03; //0x03 is gen bond with appropriate mask
   1049     UINT8   enc_size = p_cb->peer_enc_size;
   1050 
   1051     SMP_TRACE_DEBUG("%s for cmd code 0x%02x", __func__, p_cb->rcvd_cmd_code);
   1052 
   1053     if (io_caps >= BTM_IO_CAP_MAX)
   1054     {
   1055         SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with IO Capabilty \
   1056             value (0x%02x) out of range).",
   1057             p_cb->rcvd_cmd_code, io_caps);
   1058         return FALSE;
   1059     }
   1060 
   1061     if (!((oob_flag == SMP_OOB_NONE) || (oob_flag == SMP_OOB_PRESENT)))
   1062     {
   1063         SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with OOB data flag value \
   1064             (0x%02x) out of range).",
   1065              p_cb->rcvd_cmd_code, oob_flag);
   1066         return FALSE;
   1067     }
   1068 
   1069     if (!((bond_flag == SMP_AUTH_NO_BOND) || (bond_flag == SMP_AUTH_BOND)))
   1070     {
   1071         SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with Bonding_Flags value (0x%02x)\
   1072                            out of range).",
   1073                            p_cb->rcvd_cmd_code, bond_flag);
   1074         return FALSE;
   1075     }
   1076 
   1077     if ((enc_size < SMP_ENCR_KEY_SIZE_MIN) || (enc_size > SMP_ENCR_KEY_SIZE_MAX))
   1078     {
   1079         SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with Maximum Encryption \
   1080             Key value (0x%02x) out of range).",
   1081             p_cb->rcvd_cmd_code, enc_size);
   1082         return FALSE;
   1083     }
   1084 
   1085     return TRUE;
   1086 }
   1087 
   1088 /*******************************************************************************
   1089 **
   1090 ** Function         smp_pairing_keypress_notification_is_valid
   1091 **
   1092 ** Description      Validates Notification Type parameter range in the received SMP command
   1093 **                  pairing keypress notification.
   1094 **                  Returns FALSE if this parameter is out of range.
   1095 **
   1096 *******************************************************************************/
   1097 BOOLEAN smp_pairing_keypress_notification_is_valid(tSMP_CB *p_cb)
   1098 {
   1099     tBTM_SP_KEY_TYPE keypress_notification = p_cb->peer_keypress_notification;
   1100 
   1101     SMP_TRACE_DEBUG("%s for cmd code 0x%02x", __func__, p_cb->rcvd_cmd_code);
   1102 
   1103     if (keypress_notification >= BTM_SP_KEY_OUT_OF_RANGE)
   1104     {
   1105         SMP_TRACE_WARNING("Rcvd from the peer cmd 0x%02x with Pairing Keypress \
   1106             Notification value (0x%02x) out of range).",
   1107             p_cb->rcvd_cmd_code, keypress_notification);
   1108         return FALSE;
   1109     }
   1110 
   1111     return TRUE;
   1112 }
   1113 
   1114 /*******************************************************************************
   1115 **
   1116 ** Function         smp_parameter_unconditionally_valid
   1117 **
   1118 ** Description      Always returns TRUE.
   1119 **
   1120 *******************************************************************************/
   1121 BOOLEAN smp_parameter_unconditionally_valid(tSMP_CB *p_cb)
   1122 {
   1123     return TRUE;
   1124 }
   1125 
   1126 /*******************************************************************************
   1127 **
   1128 ** Function         smp_parameter_unconditionally_invalid
   1129 **
   1130 ** Description      Always returns FALSE.
   1131 **
   1132 *******************************************************************************/
   1133 BOOLEAN smp_parameter_unconditionally_invalid(tSMP_CB *p_cb)
   1134 {
   1135     return FALSE;
   1136 }
   1137 
   1138 /*******************************************************************************
   1139 **
   1140 ** Function         smp_reject_unexpected_pairing_command
   1141 **
   1142 ** Description      send pairing failure to an unexpected pairing command during
   1143 **                  an active pairing process.
   1144 **
   1145 ** Returns          void
   1146 **
   1147 *******************************************************************************/
   1148 void smp_reject_unexpected_pairing_command(BD_ADDR bd_addr)
   1149 {
   1150     BT_HDR *p_buf;
   1151     UINT8   *p;
   1152 
   1153     SMP_TRACE_DEBUG ("%s", __FUNCTION__);
   1154 
   1155     if ((p_buf = (BT_HDR *)GKI_getbuf(sizeof(BT_HDR) +\
   1156         SMP_PAIR_FAIL_SIZE + L2CAP_MIN_OFFSET)) != NULL)
   1157     {
   1158         p = (UINT8 *)(p_buf + 1) + L2CAP_MIN_OFFSET;
   1159 
   1160         UINT8_TO_STREAM (p, SMP_OPCODE_PAIRING_FAILED);
   1161         UINT8_TO_STREAM (p, SMP_PAIR_NOT_SUPPORT);
   1162 
   1163         p_buf->offset = L2CAP_MIN_OFFSET;
   1164         p_buf->len = SMP_PAIR_FAIL_SIZE;
   1165 
   1166         smp_send_msg_to_L2CAP(bd_addr, p_buf);
   1167     }
   1168 }
   1169 
   1170 /*******************************************************************************
   1171 ** Function         smp_select_association_model
   1172 **
   1173 ** Description      This function selects association model to use for STK
   1174 **                  generation. Selection is based on both sides' io capability,
   1175 **                  oob data flag and authentication request.
   1176 **
   1177 ** Note             If Secure Connections Only mode is required locally then we
   1178 **                  come to this point only if both sides support Secure Connections
   1179 **                  mode, i.e. if p_cb->secure_connections_only_mode_required = TRUE then we come
   1180 **                  to this point only if
   1181 **                      (p_cb->peer_auth_req & SMP_SC_SUPPORT_BIT) ==
   1182 **                      (p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT) ==
   1183 **                      SMP_SC_SUPPORT_BIT
   1184 **
   1185 *******************************************************************************/
   1186 tSMP_ASSO_MODEL smp_select_association_model(tSMP_CB *p_cb)
   1187 {
   1188     tSMP_ASSO_MODEL model = SMP_MODEL_OUT_OF_RANGE;
   1189     p_cb->le_secure_connections_mode_is_used = FALSE;
   1190 
   1191     SMP_TRACE_EVENT("%s", __FUNCTION__);
   1192     SMP_TRACE_DEBUG("%s p_cb->peer_io_caps = %d p_cb->local_io_capability = %d",
   1193                        __FUNCTION__, p_cb->peer_io_caps, p_cb->local_io_capability);
   1194     SMP_TRACE_DEBUG("%s p_cb->peer_oob_flag = %d p_cb->loc_oob_flag = %d",
   1195                        __FUNCTION__, p_cb->peer_oob_flag, p_cb->loc_oob_flag);
   1196     SMP_TRACE_DEBUG("%s p_cb->peer_auth_req = 0x%02x p_cb->loc_auth_req = 0x%02x",
   1197                        __FUNCTION__, p_cb->peer_auth_req, p_cb->loc_auth_req);
   1198     SMP_TRACE_DEBUG("%s p_cb->secure_connections_only_mode_required = %s",
   1199                        __FUNCTION__, p_cb->secure_connections_only_mode_required ?
   1200                                     "TRUE" : "FALSE");
   1201 
   1202     if ((p_cb->peer_auth_req & SMP_SC_SUPPORT_BIT) && (p_cb->loc_auth_req & SMP_SC_SUPPORT_BIT))
   1203     {
   1204         p_cb->le_secure_connections_mode_is_used = TRUE;
   1205     }
   1206 
   1207     SMP_TRACE_DEBUG("use_sc_process = %d", p_cb->le_secure_connections_mode_is_used);
   1208 
   1209     if (p_cb->le_secure_connections_mode_is_used)
   1210     {
   1211         model = smp_select_association_model_secure_connections(p_cb);
   1212     }
   1213     else
   1214     {
   1215         model = smp_select_legacy_association_model(p_cb);
   1216     }
   1217     return model;
   1218 }
   1219 
   1220 /*******************************************************************************
   1221 ** Function         smp_select_legacy_association_model
   1222 **
   1223 ** Description      This function is called to select association mode if at least
   1224 **                  one side doesn't support secure connections.
   1225 **
   1226 *******************************************************************************/
   1227 tSMP_ASSO_MODEL smp_select_legacy_association_model(tSMP_CB *p_cb)
   1228 {
   1229     tSMP_ASSO_MODEL model = SMP_MODEL_OUT_OF_RANGE;
   1230 
   1231     SMP_TRACE_DEBUG("%s", __func__);
   1232     /* if OOB data is present on both devices, then use OOB association model */
   1233     if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT)
   1234         return SMP_MODEL_OOB;
   1235 
   1236     /* else if neither device requires MITM, then use Just Works association model */
   1237     if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) && SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req))
   1238         return SMP_MODEL_ENCRYPTION_ONLY;
   1239 
   1240     /* otherwise use IO capability to select association model */
   1241     if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->local_io_capability < SMP_IO_CAP_MAX)
   1242     {
   1243         if (p_cb->role == HCI_ROLE_MASTER)
   1244         {
   1245             model = smp_association_table[p_cb->role][p_cb->peer_io_caps]
   1246                                          [p_cb->local_io_capability];
   1247         }
   1248         else
   1249         {
   1250             model = smp_association_table[p_cb->role][p_cb->local_io_capability]
   1251                                          [p_cb->peer_io_caps];
   1252         }
   1253     }
   1254 
   1255     return model;
   1256 }
   1257 
   1258 /*******************************************************************************
   1259 ** Function         smp_select_association_model_secure_connections
   1260 **
   1261 ** Description      This function is called to select association mode if both
   1262 **                  sides support secure connections.
   1263 **
   1264 *******************************************************************************/
   1265 tSMP_ASSO_MODEL smp_select_association_model_secure_connections(tSMP_CB *p_cb)
   1266 {
   1267     tSMP_ASSO_MODEL model = SMP_MODEL_OUT_OF_RANGE;
   1268 
   1269     SMP_TRACE_DEBUG("%s", __func__);
   1270     /* if OOB data is present on at least one device, then use OOB association model */
   1271     if (p_cb->peer_oob_flag == SMP_OOB_PRESENT || p_cb->loc_oob_flag == SMP_OOB_PRESENT)
   1272         return SMP_MODEL_SEC_CONN_OOB;
   1273 
   1274     /* else if neither device requires MITM, then use Just Works association model */
   1275     if (SMP_NO_MITM_REQUIRED (p_cb->peer_auth_req) && SMP_NO_MITM_REQUIRED(p_cb->loc_auth_req))
   1276         return SMP_MODEL_SEC_CONN_JUSTWORKS;
   1277 
   1278     /* otherwise use IO capability to select association model */
   1279     if (p_cb->peer_io_caps < SMP_IO_CAP_MAX && p_cb->local_io_capability < SMP_IO_CAP_MAX)
   1280     {
   1281         if (p_cb->role == HCI_ROLE_MASTER)
   1282         {
   1283             model = smp_association_table_sc[p_cb->role][p_cb->peer_io_caps]
   1284                                             [p_cb->local_io_capability];
   1285         }
   1286         else
   1287         {
   1288             model = smp_association_table_sc[p_cb->role][p_cb->local_io_capability]
   1289                                             [p_cb->peer_io_caps];
   1290         }
   1291     }
   1292 
   1293     return model;
   1294 }
   1295 
   1296 /*******************************************************************************
   1297 ** Function         smp_reverse_array
   1298 **
   1299 ** Description      This function reverses array bytes
   1300 **
   1301 *******************************************************************************/
   1302 void smp_reverse_array(UINT8 *arr, UINT8 len)
   1303 {
   1304     UINT8 i =0, tmp;
   1305 
   1306     SMP_TRACE_DEBUG("smp_reverse_array");
   1307 
   1308     for (i = 0; i < len/2; i ++)
   1309     {
   1310         tmp = arr[i];
   1311         arr[i] = arr[len -1 - i];
   1312         arr[len -1 - i] = tmp;
   1313     }
   1314 }
   1315 
   1316 /*******************************************************************************
   1317 ** Function         smp_calculate_random_input
   1318 **
   1319 ** Description      This function returns random input value to be used in commitment
   1320 **                  calculation for SC passkey entry association mode
   1321 **                  (if bit["round"] in "random" array == 1 then returns 0x81
   1322 **                   else returns 0x80).
   1323 **
   1324 ** Returns          ri value
   1325 **
   1326 *******************************************************************************/
   1327 UINT8 smp_calculate_random_input(UINT8 *random, UINT8 round)
   1328 {
   1329     UINT8 i = round/8;
   1330     UINT8 j = round%8;
   1331     UINT8 ri;
   1332 
   1333     SMP_TRACE_DEBUG("random: 0x%02x, round: %d, i: %d, j: %d", random[i], round, i, j);
   1334     ri = ((random[i] >> j) & 1) | 0x80;
   1335     SMP_TRACE_DEBUG("%s ri=0x%02x", __func__, ri);
   1336     return ri;
   1337 }
   1338 
   1339 /*******************************************************************************
   1340 ** Function         smp_collect_local_io_capabilities
   1341 **
   1342 ** Description      This function puts into IOcap array local device
   1343 **                  IOCapability, OOB data, AuthReq.
   1344 **
   1345 ** Returns          void
   1346 **
   1347 *******************************************************************************/
   1348 void smp_collect_local_io_capabilities(UINT8 *iocap, tSMP_CB *p_cb)
   1349 {
   1350     SMP_TRACE_DEBUG("%s", __func__);
   1351 
   1352     iocap[0] = p_cb->local_io_capability;
   1353     iocap[1] = p_cb->loc_oob_flag;
   1354     iocap[2] = p_cb->loc_auth_req;
   1355 }
   1356 
   1357 /*******************************************************************************
   1358 ** Function         smp_collect_peer_io_capabilities
   1359 **
   1360 ** Description      This function puts into IOcap array peer device
   1361 **                  IOCapability, OOB data, AuthReq.
   1362 **
   1363 ** Returns          void
   1364 **
   1365 *******************************************************************************/
   1366 void smp_collect_peer_io_capabilities(UINT8 *iocap, tSMP_CB *p_cb)
   1367 {
   1368     SMP_TRACE_DEBUG("%s", __func__);
   1369 
   1370     iocap[0] = p_cb->peer_io_caps;
   1371     iocap[1] = p_cb->peer_oob_flag;
   1372     iocap[2] = p_cb->peer_auth_req;
   1373 }
   1374 
   1375 /*******************************************************************************
   1376 ** Function         smp_collect_local_ble_address
   1377 **
   1378 ** Description      This function puts into le_addr array local device le address:
   1379 **                  le_addr[0-5] = local BD ADDR,
   1380 **                  le_addr[6] = local le address type (PUBLIC/RANDOM).
   1381 **
   1382 ** Returns          void
   1383 **
   1384 *******************************************************************************/
   1385 void smp_collect_local_ble_address(UINT8 *le_addr, tSMP_CB *p_cb)
   1386 {
   1387     tBLE_ADDR_TYPE  addr_type = 0;
   1388     BD_ADDR         bda;
   1389     UINT8           *p = le_addr;
   1390 
   1391     SMP_TRACE_DEBUG("%s", __func__);
   1392 
   1393     BTM_ReadConnectionAddr( p_cb->pairing_bda, bda, &addr_type);
   1394     BDADDR_TO_STREAM(p, bda);
   1395     UINT8_TO_STREAM(p, addr_type);
   1396 }
   1397 
   1398 /*******************************************************************************
   1399 ** Function         smp_collect_peer_ble_address
   1400 **
   1401 ** Description      This function puts into le_addr array peer device le address:
   1402 **                  le_addr[0-5] = peer BD ADDR,
   1403 **                  le_addr[6] = peer le address type (PUBLIC/RANDOM).
   1404 **
   1405 ** Returns          void
   1406 **
   1407 *******************************************************************************/
   1408 void smp_collect_peer_ble_address(UINT8 *le_addr, tSMP_CB *p_cb)
   1409 {
   1410     tBLE_ADDR_TYPE  addr_type = 0;
   1411     BD_ADDR         bda;
   1412     UINT8           *p = le_addr;
   1413 
   1414     SMP_TRACE_DEBUG("%s", __func__);
   1415 
   1416     if (!BTM_ReadRemoteConnectionAddr(p_cb->pairing_bda, bda, &addr_type))
   1417     {
   1418         SMP_TRACE_ERROR("can not collect peer le addr information for unknown device");
   1419         return;
   1420     }
   1421 
   1422     BDADDR_TO_STREAM(p, bda);
   1423     UINT8_TO_STREAM(p, addr_type);
   1424 }
   1425 
   1426 /*******************************************************************************
   1427 ** Function         smp_check_commitment
   1428 **
   1429 ** Description      This function compares peer commitment values:
   1430 **                  - expected (i.e. calculated locally),
   1431 **                  - received from the peer.
   1432 **
   1433 ** Returns          TRUE  if the values are the same
   1434 **                  FALSE otherwise
   1435 **
   1436 *******************************************************************************/
   1437 BOOLEAN smp_check_commitment(tSMP_CB *p_cb)
   1438 {
   1439     BT_OCTET16 expected;
   1440 
   1441     SMP_TRACE_DEBUG("%s", __func__);
   1442 
   1443     smp_calculate_peer_commitment(p_cb, expected);
   1444     print128(expected, (const UINT8 *)"calculated peer commitment");
   1445     print128(p_cb->remote_commitment, (const UINT8 *)"received peer commitment");
   1446 
   1447     if (memcmp(p_cb->remote_commitment, expected, BT_OCTET16_LEN))
   1448     {
   1449         SMP_TRACE_WARNING("Commitment check fails");
   1450         return FALSE;
   1451     }
   1452 
   1453     SMP_TRACE_DEBUG("Commitment check succeeds");
   1454     return TRUE;
   1455 }
   1456 
   1457 /*******************************************************************************
   1458 **
   1459 ** Function         smp_save_secure_connections_long_term_key
   1460 **
   1461 ** Description      The function saves SC LTK as BLE key for future use as local
   1462 **                  and/or peer key.
   1463 **
   1464 ** Returns          void
   1465 **
   1466 *******************************************************************************/
   1467 void smp_save_secure_connections_long_term_key(tSMP_CB *p_cb)
   1468 {
   1469     tBTM_LE_LENC_KEYS   lle_key;
   1470     tBTM_LE_PENC_KEYS   ple_key;
   1471 
   1472     SMP_TRACE_DEBUG("%s-Save LTK as local LTK key", __func__);
   1473     memcpy(lle_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
   1474     lle_key.div = 0;
   1475     lle_key.key_size = p_cb->loc_enc_size;
   1476     lle_key.sec_level = p_cb->sec_level;
   1477     btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_LENC, (tBTM_LE_KEY_VALUE *)&lle_key, TRUE);
   1478 
   1479     SMP_TRACE_DEBUG("%s-Save LTK as peer LTK key", __func__);
   1480     ple_key.ediv = 0;
   1481     memset(ple_key.rand, 0, BT_OCTET8_LEN);
   1482     memcpy(ple_key.ltk, p_cb->ltk, BT_OCTET16_LEN);
   1483     ple_key.sec_level = p_cb->sec_level;
   1484     ple_key.key_size  = p_cb->loc_enc_size;
   1485     btm_sec_save_le_key(p_cb->pairing_bda, BTM_LE_KEY_PENC, (tBTM_LE_KEY_VALUE *)&ple_key, TRUE);
   1486 }
   1487 
   1488 /*******************************************************************************
   1489 **
   1490 ** Function         smp_calculate_f5_mackey_and_long_term_key
   1491 **
   1492 ** Description      The function calculates MacKey and LTK and saves them in CB.
   1493 **                  To calculate MacKey and LTK it calls smp_calc_f5(...).
   1494 **                  MacKey is used in dhkey calculation, LTK is used to encrypt
   1495 **                  the link.
   1496 **
   1497 ** Returns          FALSE if out of resources, TRUE otherwise.
   1498 **
   1499 *******************************************************************************/
   1500 BOOLEAN smp_calculate_f5_mackey_and_long_term_key(tSMP_CB *p_cb)
   1501 {
   1502     UINT8 a[7];
   1503     UINT8 b[7];
   1504     UINT8 *p_na;
   1505     UINT8 *p_nb;
   1506 
   1507     SMP_TRACE_DEBUG("%s", __func__);
   1508 
   1509     if (p_cb->role == HCI_ROLE_MASTER)
   1510     {
   1511         smp_collect_local_ble_address(a, p_cb);
   1512         smp_collect_peer_ble_address(b, p_cb);
   1513         p_na = p_cb->rand;
   1514         p_nb = p_cb->rrand;
   1515     }
   1516     else
   1517     {
   1518         smp_collect_local_ble_address(b, p_cb);
   1519         smp_collect_peer_ble_address(a, p_cb);
   1520         p_na = p_cb->rrand;
   1521         p_nb = p_cb->rand;
   1522     }
   1523 
   1524     if(!smp_calculate_f5(p_cb->dhkey, p_na, p_nb, a, b, p_cb->mac_key, p_cb->ltk))
   1525     {
   1526         SMP_TRACE_ERROR("%s failed", __func__);
   1527         return FALSE;
   1528     }
   1529 
   1530     SMP_TRACE_EVENT ("%s is completed", __func__);
   1531     return TRUE;
   1532 }
   1533 
   1534 /*******************************************************************************
   1535 **
   1536 ** Function         smp_request_oob_data
   1537 **
   1538 ** Description      Requests application to provide OOB data.
   1539 **
   1540 ** Returns          TRUE - OOB data has to be provided by application
   1541 **                  FALSE - otherwise (unexpected)
   1542 **
   1543 *******************************************************************************/
   1544 BOOLEAN smp_request_oob_data(tSMP_CB *p_cb)
   1545 {
   1546     tSMP_OOB_DATA_TYPE req_oob_type = SMP_OOB_INVALID_TYPE;
   1547 
   1548     SMP_TRACE_DEBUG("%s", __func__);
   1549 
   1550     if (p_cb->peer_oob_flag == SMP_OOB_PRESENT && p_cb->loc_oob_flag == SMP_OOB_PRESENT)
   1551     {
   1552         /* both local and peer rcvd data OOB */
   1553         req_oob_type = SMP_OOB_BOTH;
   1554     }
   1555     else if (p_cb->peer_oob_flag == SMP_OOB_PRESENT)
   1556     {
   1557         /* peer rcvd OOB local data, local didn't receive OOB peer data */
   1558         req_oob_type = SMP_OOB_LOCAL;
   1559     }
   1560     else if (p_cb->loc_oob_flag == SMP_OOB_PRESENT)
   1561     {
   1562         req_oob_type = SMP_OOB_PEER;
   1563     }
   1564 
   1565     SMP_TRACE_DEBUG("req_oob_type = %d", req_oob_type);
   1566 
   1567     if (req_oob_type == SMP_OOB_INVALID_TYPE)
   1568         return FALSE;
   1569 
   1570     p_cb->req_oob_type = req_oob_type;
   1571     p_cb->cb_evt = SMP_SC_OOB_REQ_EVT;
   1572     smp_sm_event(p_cb, SMP_TK_REQ_EVT, &req_oob_type);
   1573 
   1574     return TRUE;
   1575 }
   1576 
   1577 
   1578 #endif
   1579 
   1580