Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc5cc7ac authored by Casper Bonde's avatar Casper Bonde Committed by Pavlin Radoslavov
Browse files

SAP: Make it possible to enforce a 16-digit pin code (1/5)



This change enable the posibility to enforce using a
16-digit pin or MITM for a RFCOMM or L2CAP connection.

This is needed for the SIM access profile.

Change-Id: I02886ce284f27295205def3c66fb76372f5dab4f
Signed-off-by: default avatarCasper Bonde <c.bonde@samsung.com>
parent 0828a2a9
Loading
Loading
Loading
Loading
+7 −4
Original line number Original line Diff line number Diff line
@@ -54,7 +54,7 @@ static void bta_dm_find_services ( BD_ADDR bd_addr);
static void bta_dm_discover_next_device(void);
static void bta_dm_discover_next_device(void);
static void bta_dm_sdp_callback (UINT16 sdp_status);
static void bta_dm_sdp_callback (UINT16 sdp_status);
static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator);
static UINT8 bta_dm_authorize_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, UINT8 *service_name, UINT8 service_id, BOOLEAN is_originator);
static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name);
static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, BOOLEAN min_16_digit);
static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, LINK_KEY key, UINT8 key_type);
static UINT8 bta_dm_new_link_key_cback(BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name, LINK_KEY key, UINT8 key_type);
static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result);
static UINT8 bta_dm_authentication_complete_cback(BD_ADDR bd_addr, DEV_CLASS dev_class,BD_NAME bd_name, int result);
static void bta_dm_local_name_cback(BD_ADDR bd_addr);
static void bta_dm_local_name_cback(BD_ADDR bd_addr);
@@ -743,7 +743,8 @@ void bta_dm_add_device (tBTA_DM_MSG *p_data)
    }
    }


    if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
    if (!BTM_SecAddDevice (p_dev->bd_addr, p_dc, p_dev->bd_name, p_dev->features,
                           trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap))
                           trusted_services_mask, p_lc, p_dev->key_type, p_dev->io_cap,
                           p_dev->pin_length))
    {
    {
        APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
        APPL_TRACE_ERROR ("BTA_DM: Error adding device %08x%04x",
                (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
                (p_dev->bd_addr[0]<<24)+(p_dev->bd_addr[1]<<16)+(p_dev->bd_addr[2]<<8)+p_dev->bd_addr[3],
@@ -2724,7 +2725,8 @@ static void bta_dm_pinname_cback (void *p_data)
** Returns          void
** Returns          void
**
**
*******************************************************************************/
*******************************************************************************/
static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name)
static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_name,
        BOOLEAN min_16_digit)
{
{
    tBTA_DM_SEC sec_event;
    tBTA_DM_SEC sec_event;


@@ -2747,6 +2749,7 @@ static UINT8 bta_dm_pin_cback (BD_ADDR bd_addr, DEV_CLASS dev_class, BD_NAME bd_
    BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
    BTA_COPY_DEVICE_CLASS(sec_event.pin_req.dev_class, dev_class);
    BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
    BCM_STRNCPY_S((char*)sec_event.pin_req.bd_name, sizeof(BD_NAME), (char*)bd_name, (BD_NAME_LEN-1));
    sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
    sec_event.pin_req.bd_name[BD_NAME_LEN-1] = 0;
    sec_event.pin_req.min_16_digit = min_16_digit;


    bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
    bta_dm_cb.p_sec_cback(BTA_DM_PIN_REQ_EVT, &sec_event);
    return BTM_CMD_STARTED;
    return BTM_CMD_STARTED;
+2 −1
Original line number Original line Diff line number Diff line
@@ -496,7 +496,7 @@ void BTA_DmConfirm(BD_ADDR bd_addr, BOOLEAN accept)
*******************************************************************************/
*******************************************************************************/
void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key,
void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key,
                     tBTA_SERVICE_MASK trusted_mask, BOOLEAN is_trusted,
                     tBTA_SERVICE_MASK trusted_mask, BOOLEAN is_trusted,
                     UINT8 key_type, tBTA_IO_CAP io_cap)
                     UINT8 key_type, tBTA_IO_CAP io_cap, UINT8 pin_length)
{
{


    tBTA_DM_API_ADD_DEVICE *p_msg;
    tBTA_DM_API_ADD_DEVICE *p_msg;
@@ -527,6 +527,7 @@ void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class, LINK_KEY link_key,


        memset (p_msg->bd_name, 0, BD_NAME_LEN);
        memset (p_msg->bd_name, 0, BD_NAME_LEN);
        memset (p_msg->features, 0, sizeof (p_msg->features));
        memset (p_msg->features, 0, sizeof (p_msg->features));
        p_msg->pin_length = pin_length;


        bta_sys_sendmsg(p_msg);
        bta_sys_sendmsg(p_msg);
    }
    }
+1 −0
Original line number Original line Diff line number Diff line
@@ -356,6 +356,7 @@ typedef struct
    BOOLEAN             dc_known;
    BOOLEAN             dc_known;
    BD_NAME             bd_name;
    BD_NAME             bd_name;
    UINT8               features[BTA_FEATURE_BYTES_PER_PAGE * (BTA_EXT_FEATURES_PAGE_MAX + 1)];
    UINT8               features[BTA_FEATURE_BYTES_PER_PAGE * (BTA_EXT_FEATURES_PAGE_MAX + 1)];
    UINT8               pin_length;
} tBTA_DM_API_ADD_DEVICE;
} tBTA_DM_API_ADD_DEVICE;


/* data type for BTA_DM_API_REMOVE_ACL_EVT */
/* data type for BTA_DM_API_REMOVE_ACL_EVT */
+5 −2
Original line number Original line Diff line number Diff line
@@ -170,8 +170,10 @@ typedef struct
#define BTA_SEC_AUTHENTICATE    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_OUT_AUTHENTICATE) /* Authentication required. */
#define BTA_SEC_AUTHENTICATE    (BTM_SEC_IN_AUTHENTICATE | BTM_SEC_OUT_AUTHENTICATE) /* Authentication required. */
#define BTA_SEC_ENCRYPT         (BTM_SEC_IN_ENCRYPT | BTM_SEC_OUT_ENCRYPT)           /* Encryption required. */
#define BTA_SEC_ENCRYPT         (BTM_SEC_IN_ENCRYPT | BTM_SEC_OUT_ENCRYPT)           /* Encryption required. */
#define BTA_SEC_MODE4_LEVEL4    (BTM_SEC_MODE4_LEVEL4)                               /* Mode 4 level 4 service, i.e. incoming/outgoing MITM and P-256 encryption */
#define BTA_SEC_MODE4_LEVEL4    (BTM_SEC_MODE4_LEVEL4)                               /* Mode 4 level 4 service, i.e. incoming/outgoing MITM and P-256 encryption */
#define BTA_SEC_MITM            (BTM_SEC_IN_MITM | BTM_SEC_OUT_MITM)                 /* Man-In-The_Middle protection */
#define BTA_SEC_IN_16_DIGITS    (BTM_SEC_IN_MIN_16_DIGIT_PIN)                        /* Min 16 digit for pin code */


typedef UINT8 tBTA_SEC;
typedef UINT16 tBTA_SEC;


/* Ignore for Discoverable, Connectable, Pairable and Connectable Paired only device modes */
/* Ignore for Discoverable, Connectable, Pairable and Connectable Paired only device modes */


@@ -651,6 +653,7 @@ typedef struct
    BD_ADDR         bd_addr;            /* BD address peer device. */
    BD_ADDR         bd_addr;            /* BD address peer device. */
    DEV_CLASS       dev_class;          /* Class of Device */
    DEV_CLASS       dev_class;          /* Class of Device */
    BD_NAME         bd_name;            /* Name of peer device. */
    BD_NAME         bd_name;            /* Name of peer device. */
    BOOLEAN         min_16_digit;       /* TRUE if the pin returned must be at least 16 digits */
} tBTA_DM_PIN_REQ;
} tBTA_DM_PIN_REQ;


/* BLE related definition */
/* BLE related definition */
@@ -1606,7 +1609,7 @@ extern void BTA_DmConfirm(BD_ADDR bd_addr, BOOLEAN accept);
extern void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class,
extern void BTA_DmAddDevice(BD_ADDR bd_addr, DEV_CLASS dev_class,
                            LINK_KEY link_key, tBTA_SERVICE_MASK trusted_mask,
                            LINK_KEY link_key, tBTA_SERVICE_MASK trusted_mask,
                            BOOLEAN is_trusted, UINT8 key_type,
                            BOOLEAN is_trusted, UINT8 key_type,
                            tBTA_IO_CAP io_cap);
                            tBTA_IO_CAP io_cap, UINT8 pin_length);


/*******************************************************************************
/*******************************************************************************
**
**
+3 −3
Original line number Original line Diff line number Diff line
@@ -907,7 +907,7 @@ static void btif_dm_pin_req_evt(tBTA_DM_PIN_REQ *p_pin_req)
    }
    }


    /* check for auto pair possiblity only if bond was initiated by local device */
    /* check for auto pair possiblity only if bond was initiated by local device */
    if (pairing_cb.is_local_initiated)
    if (pairing_cb.is_local_initiated && (p_pin_req->min_16_digit == FALSE))
    {
    {
        if (check_cod(&bd_addr, COD_AV_HEADSETS) ||
        if (check_cod(&bd_addr, COD_AV_HEADSETS) ||
            check_cod(&bd_addr, COD_AV_HANDSFREE) ||
            check_cod(&bd_addr, COD_AV_HANDSFREE) ||
@@ -951,7 +951,7 @@ static void btif_dm_pin_req_evt(tBTA_DM_PIN_REQ *p_pin_req)
        }
        }
    }
    }
    HAL_CBACK(bt_hal_cbacks, pin_request_cb,
    HAL_CBACK(bt_hal_cbacks, pin_request_cb,
                     &bd_addr, &bd_name, cod);
                     &bd_addr, &bd_name, cod, p_pin_req->min_16_digit);
}
}


/*******************************************************************************
/*******************************************************************************
@@ -3116,7 +3116,7 @@ static void btif_dm_ble_passkey_req_evt(tBTA_DM_PIN_REQ *p_pin_req)
    cod = COD_UNCLASSIFIED;
    cod = COD_UNCLASSIFIED;


    HAL_CBACK(bt_hal_cbacks, pin_request_cb,
    HAL_CBACK(bt_hal_cbacks, pin_request_cb,
              &bd_addr, &bd_name, cod);
              &bd_addr, &bd_name, cod, FALSE);
}
}
static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF *p_notif_req)
static void btif_dm_ble_key_nc_req_evt(tBTA_DM_SP_KEY_NOTIF *p_notif_req)
{
{
Loading