This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1352P7:BLE 外设安全设置被中央器件覆盖

Guru**** 2644585 points

Other Parts Discussed in Thread: SYSCONFIG, CC1352P7

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1577266/cc1352p7-ble-peripheral-security-setting-gets-overwritten-by-the-central

器件型号: CC1352P7
主题中讨论的其他器件: SysConfig

您好、我的朋友:

我已经使用简单外设示例制作了一个定制外设。

我将 Zephyr RTOS 用于中央器件、尽管我已设置 SysConfig、使外设应发起配对和安全连接、但中央应用在创建连接时会将连接更改为非安全或 L1 级别。  

然而,当我在 iPhone 上使用 nrfConnect 应用程序时,它被提示进入绑定和配对过程,我可以看到该绑定管理器回调。

我想知道为什么会发生这种情况、以及从外围端强制加密连接的最佳方式是什么。

谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有任何更新?  
    这是一个温和的提醒,我仍在等待你的答复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是否有任何更新?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 Omid!

    我想先道歉我的答案的延迟,该主题最初分配到一个过时的电子邮件. 此问题现已解决、现在将很快获得支持。

    您选择的 Sysconfig 选项表明连接后、外设将尝试启动配对过程。 但是、中心设备可能在您的外设完成之前发送了此类配对请求、因此它们是发起配对的一方。

    我不确定您的目标是什么。 听起来好像您对中央设备发送配对请求而不是外设都不满意、即使这两种情况都应该在设备配对后结束。 如果您的目标是强制与外围设备进行配对和绑定、您可以通过将其权限设置为需要经过身份验证的绑定才能读取来保护您的特性和服务。 有关 GATT 安全的用户指南一章介绍了如何执行此操作

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的重播 Lea、



    我想做的是强制连接外围设备并确保连接安全。
    我的意思是、无论中心是什么、我都希望外围设备强制连接处于安全的 L2 级别。

    我只能在 Zephyr RTOS 中执行该操作、但出于某种原因、集中式覆盖此设置。
    我在手机上试用了 nrfConnect 应用程序、在该应用程序上、外围设备强制配对、但当我使用我在 Zephyr RTOS 和 nrfSDK 上创建的自定义中央应用程序时、中央强制执行该操作、安全级别将是一个。

    我想知道如何解决这个问题?
    我更希望从一开始就确保所有连接的安全、而不是在特征上强制实施安全。
    但是、如果这是强制进行加密通信的唯一方法、我就会采用这种方法。

    谢谢。



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    连接的安全级别由蓝牙规范定义、并考虑了多个参数。 它将始终尝试使用给定的参数(例如 LE 安全连接支持、IO 功能等)达到 CAN 的最高级别安全性

    如果中央器件由于某种原因无法或拒绝达到 L2 级别的安全、则外设无法强制升级连接。 例如、在 Zephyr 中、bt_conn_set_security 在变量 (conn->required_sec_level) 中设置所需的安全级别。 更改安全级别后、将该级别与之前所需的级别进行比较。 如果电平较低、则用户可以自由地终止连接。

    您可以使用 SimpleLink SDK 执行相同的操作、即在 GapManager 回调中读取连接的安全级别、如果此级别不足、则可以终止连接。 除此之外、我建议设置您特征的 GATT 安全级别、正如我在上一篇文章中提到的那样。

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Lea、

    我看到、是的、在 Zephyr 程序 上、我通常在外设上执行完全相同的操作、以将安全级别从外设端强制设置为 L2。
    您能给我一个代码片段、其中包含 GAP 回调和所有功能、以及关于什么事件回调、我应该终止它并使用什么 API。

    谢谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、

    您需要的大部分内容都位于 basic_ble 示例的 app_pairing.c 文件中。
    首先、通过 PairingPairStateHandler 变量处理已更改配对状态的回调。 事件掩码设置为完成与配对相关的事件。

    接下来、在事件处理程序函数 (Pairing_pairStateHandler) 中、  您可以使用 linkDB_encrypted 宏来检查您的连接是否确实已加密 (BLE 中的 AKA 安全 L2)。 如果连接未加密、您可以使用 GAP_TerminateLinkReq 断开连接

    您的函数将如下所示:

    void Pairing_pairStateHandler(uint32 event, BLEAppUtil_msgHdr_t *pMsgData)
    {
        switch (event)
        {
            ...
            
            case BLEAPPUTIL_PAIRING_STATE_COMPLETE:
            {
                MenuModule_printf(APP_MENU_PAIRING_EVENT, 0, "Pairing Status: Complete - "
                                  "connectionHandle = "MENU_MODULE_COLOR_YELLOW "%d " MENU_MODULE_COLOR_RESET
                                  "status = "MENU_MODULE_COLOR_YELLOW "%d " MENU_MODULE_COLOR_RESET,
                                  ((BLEAppUtil_PairStateData_t *)pMsgData)->connHandle,
                                  ((BLEAppUtil_PairStateData_t *)pMsgData)->status);
    
                
                // If the connection is not encrypted/L2 security is not reached
                if (!linkDB_Encrypted(((BLEAppUtil_PairStateData_t *)pMsgData)->connHandle)))
                {
                  GAP_TerminateLinkReq(((BLEAppUtil_PairStateData_t *)pMsgData)->connHandle, 0x16);
                }
                break;
            }
    
            ...
    
            default:
            {
                break;
            }
        }
    
    }

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的详细信息、但我未使用基本 BLE 应用。
    我正在使用 simple_peripheral 示例、 该示例中没有 app_pairing.c。
    此外、我意识到我的芯片没有名为 cc1352p7_1 的 simple_ble 示例(我的 SDK 版本为 8.30.1.1)

    此致、
    Omid

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    这是一个温和的提醒,我仍在等待你的答复。
    此致、
    Omid

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    抱歉、是的、basic_ble 示例仅适用于 F3 SDK。 simple_peripheral 示例非常接近这方面的 basic_ble 示例。 两个示例中的 API 函数是相同的、唯一真正更改的是事件处理程序函数名称。 我更新了指向 API 函数和代码的链接。 下面是一些关于如何在 simple_peripheral 示例上执行相同操作的导线:

    在配对事件处理程序函数 (SimplePeripheral_processPairState) 中、 您可以使用 linkDB_encrypted 宏来检查您的连接是否确实已加密 (BLE 中的 AKA 安全 L2)。 如果连接未加密、您可以使用 GAP_TerminateLinkReq 断开连接

    下面是代码的样子:

    void SimplePeripheral_processPairState(spPairStateData_t *pPairData)
    {
      uint8_t state = pPairData->state;
      uint8_t status = pPairData->status;
    
      switch (state)
      {
            ...
            
            case BLEAPPUTIL_PAIRING_STATE_COMPLETE:
            {
                if (status == SUCCESS)
                  {
                    Display_printf(dispHandle, SP_ROW_CONNECTION, 0, "Pairing success");
                  }
                  else
                  {
                    Display_printf(dispHandle, SP_ROW_CONNECTION, 0, "Pairing fail: %d", status);
                  }
          
                // If the connection is not encrypted/L2 security is not reached
                if (!linkDB_Encrypted(((BLEAppUtil_PairStateData_t *)pMsgData)->connHandle)))
                {
                  GAP_TerminateLinkReq(((BLEAppUtil_PairStateData_t *)pMsgData)->connHandle, 0x16);
                }
                break;
            }
    
            ...
    
        }
    
    }

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Lea、但有几 件事要提。

    首先、bond Manager 回调中不存在 pMsg。  
    其次、我不会执行 Bond Manager 回调。
    第三、我  在 GAP 连接事件(如“link stablished“和“link param update request“)中尝试了这个实用程序宏、但它也不起作用。


    所以、问题仍然存在。
    谢谢。




    以下是 SysConfig 为绑定管理器生成的配置:

    uint8_t pairMode                =    GAPBOND_PAIRING_MODE_INITIATE;
    uint8_t mitm                    =    true;
    uint8_t ioCap                   =    GAPBOND_IO_CAP_KEYBOARD_DISPLAY; // I tried other options as well!
    uint8_t bonding                 =    true;
    uint8_t secureConnection        =    GAPBOND_SECURE_CONNECTION_ONLY; // I tried other options as well!
    uint8_t authenPairingOnly       =    false;
    uint8_t autoSyncWL              =    false;
    uint8_t eccReGenPolicy          =    0;
    uint8_t KeySize                 =    16;
    uint8_t removeLRUBond           =    false;
    uint8_t KeyDistList             =    GAPBOND_KEYDIST_MENCKEY | GAPBOND_KEYDIST_MIDKEY | GAPBOND_KEYDIST_MSIGN | GAPBOND_KEYDIST_SENCKEY | GAPBOND_KEYDIST_SIDKEY | GAPBOND_KEYDIST_SSIGN;
    uint8_t eccDebugKeys            =    false;
    uint8_t allowDebugKeys          =    true;
    uint8_t eraseBondWhileInConn    =    false;
    uint8_t sameIrkAction           =    GAPBOND_SAME_IRK_UPDATE_BOND_REC;
    
    void setBondManagerParameters()
    {
        GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);
        GAPBondMgr_SetParameter(GAPBOND_MITM_PROTECTION, sizeof(uint8_t), &mitm);
        GAPBondMgr_SetParameter(GAPBOND_IO_CAPABILITIES, sizeof(uint8_t), &ioCap);
        GAPBondMgr_SetParameter(GAPBOND_BONDING_ENABLED, sizeof(uint8_t), &bonding);
        GAPBondMgr_SetParameter(GAPBOND_SECURE_CONNECTION, sizeof(uint8_t), &secureConnection);
        // Set Authenticated Pairing Only mode
        GAPBondMgr_SetParameter(GAPBOND_AUTHEN_PAIRING_ONLY, sizeof(uint8_t), &authenPairingOnly);
        // Set Auto Acceptlist Sync
        GAPBondMgr_SetParameter(GAP_ADV_WL_POLICY_ANY_REQ, sizeof(uint8_t), &autoSyncWL);
        GAPBondMgr_SetParameter(GAPBOND_ECCKEY_REGEN_POLICY, sizeof(uint8_t), &eccReGenPolicy);
        GAPBondMgr_SetParameter(GAPBOND_KEYSIZE, sizeof(uint8_t), &KeySize);
        GAPBondMgr_SetParameter(GAPBOND_LRU_BOND_REPLACEMENT, sizeof(uint8_t), &removeLRUBond);
        GAPBondMgr_SetParameter(GAPBOND_KEY_DIST_LIST, sizeof(uint8_t), &KeyDistList);
        // Set Secure Connection Debug Keys
        GAPBondMgr_SetParameter(GAPBOND_SC_HOST_DEBUG, sizeof(uint8_t), &eccDebugKeys);
        // Set Allow Debug Keys
        GAPBondMgr_SetParameter(GAPBOND_ALLOW_DEBUG_KEYS, sizeof(uint8_t), &allowDebugKeys);
        // Set the Erase bond While in Active Connection Flag
        GAPBondMgr_SetParameter(GAPBOND_ERASE_BOND_IN_CONN, sizeof(uint8_t), &eraseBondWhileInConn);
        GAPBondMgr_SetParameter(GAPBOND_SAME_IRK_OPTION, sizeof(uint8_t), &sameIrkAction);
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我认为您的 SysConfig 选项看起来很合适。 如果您的软件基于 simple_peripheral 示例、则应该 在 simple_peripheral.c 文件中具有一个名为 SimplePeripheral_processPairState 的函数。 能否说明您所使用的 SDK 版本? 您过去是否删除了此功能?

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、我已经在上面提到过
    1) 我的 SDK 版本是 8.30.1.1
    2) 我没有删除它,如果我在我的 iPhone 上使用 nrf connect,我确实从 你提到的功能得到了配对回调。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我将花一些时间使用 simple_peripheral 示例和我向您展示的代码制作一个工作示例、并尽快将其提供给您、以便您了解在您自己的工程上重现的步骤。

    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、
    期待收到您的回复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨 Omid,这里是一个项目,当配对未加密或拒绝时终止链接。 我更改的仅有 2 件事是在 SysConfig 中、最初要求发出配对请求;如果链接在配对回调中未加密、则终止链接。

    case GAPBOND_PAIRING_STATE_COMPLETE:
      if (status == SUCCESS)
      {
        Display_printf(dispHandle, SP_ROW_CONNECTION, 0, "Pairing success");
      }
      else
      {
        Display_printf(dispHandle, SP_ROW_CONNECTION, 0, "Pairing fail: %d", status);
      }
    
    // If the connection is not encrypted/L2 security is not reached
    if (!linkDB_Encrypted(pPairData->connHandle))
    {
      GAP_TerminateLinkReq(pPairData->connHandle, 0x16);
    }
    break;

    e2e.ti.com/.../8508.simple_5F00_peripheral.c

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如我已经说过几次,我强烈怀疑这会有效,因为我在使用我的 Zephyr 中央应用程序时根本没有得到回调。
    然而,这是有效的,如果我使用我的 iPhone 和 nrfConnect 应用程序作为中央应用程序,我们会得到回调。

    不管怎样,我会再试一次,并很快发布一个答复。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您看到 Zephyr 中央应用程序与 simplelink connect 应用程序之间存在差异、则可以尝试使用嗅探器来查看差异。