CC2640蓝牙密码配对出现的漏洞
问题现象:CC2640作为蓝牙发起设备,设置为需要密码配对但不绑定模式(密码设置为123456),分别采用IOS和Android蓝牙APP进行测试,现象如下:
1. 当使用IOS系统中蓝牙APP——LightBlue进行连接CC2640设备时,IOS手机端弹出配对框,此时必须输入密码才能与设备正常连接通讯,但这个输入的密码只要包含了正确的密码就可以连接,正确密码为“123456”,但我输入如“0123456”、“12345678”、“0123456789”等这样的密码均可以正常连接通讯。
2. 当使用Android系统中蓝牙APP进行连接CC2640设备时,Android手机端选择不输入任何密码,此时也可以正常连接该设备,通讯也正常。
请问这两个现象是什么原因导致,怎么解决啊?
方便把你的配置发出来吗?如果禁止了IO capacity,会使用just works完成配对
这是配置:
// Setup the GAP //BY ZCX TGAP_CONN_PAUSE_PERIPHERAL参数更新请求
GAP_SetParamValue(TGAP_CONN_PAUSE_PERIPHERAL, DEFAULT_CONN_PAUSE_PERIPHERAL);
// Setup the GAP Peripheral Role Profile
{
// For all hardware platforms, device starts advertising upon initialization
uint8_t initialAdvertEnable = TRUE;
// By setting this to zero, the device will go into the waiting state after
// being discoverable for 30.72 second, and will not being advertising again
// until the enabler is set back to TRUE
uint16_t advertOffTime = 0;
uint8_t enableUpdateRequest = DEFAULT_ENABLE_UPDATE_REQUEST;//BY ZCX使能请求更新
uint16_t desiredMinInterval = DEFAULT_DESIRED_MIN_CONN_INTERVAL;//BY ZCX最小连接间隔
uint16_t desiredMaxInterval = DEFAULT_DESIRED_MAX_CONN_INTERVAL;//BY ZCX最大连接间隔
uint16_t desiredSlaveLatency = DEFAULT_DESIRED_SLAVE_LATENCY;//BY ZCX从潜伏期
uint16_t desiredConnTimeout = DEFAULT_DESIRED_CONN_TIMEOUT;//BY ZCX监督超时
// Set the GAP Role Parameters
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t),
&initialAdvertEnable);//BY ZCX 广播使能
GAPRole_SetParameter(GAPROLE_ADVERT_OFF_TIME, sizeof(uint16_t),
&advertOffTime);//BY ZCX 广播关闭时间
GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData),
scanRspData);//BY ZCX 扫描请求数据
GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);//BY ZCX 广播数据
GAPRole_SetParameter(GAPROLE_PARAM_UPDATE_ENABLE, sizeof(uint8_t),
&enableUpdateRequest);//BY ZCX 从机连接参数更新使能
GAPRole_SetParameter(GAPROLE_MIN_CONN_INTERVAL, sizeof(uint16_t),
&desiredMinInterval);//BY ZCX 最小连接时间间隔
GAPRole_SetParameter(GAPROLE_MAX_CONN_INTERVAL, sizeof(uint16_t),
&desiredMaxInterval);//BY ZCX 最大连接时间间隔
GAPRole_SetParameter(GAPROLE_SLAVE_LATENCY, sizeof(uint16_t),
&desiredSlaveLatency);//BY ZCX 从机潜伏
GAPRole_SetParameter(GAPROLE_TIMEOUT_MULTIPLIER, sizeof(uint16_t),
&desiredConnTimeout);//BY ZCX 最大耐心等待时间?
}
// Set the GAP Characteristics
GGS_SetParameter(GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName);
// Set advertising interval
{
uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL;//BY ZCX 广播时间间隔
GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MIN, advInt);//BY ZCX 在限制发现模式下最小广播时间间隔
GAP_SetParamValue(TGAP_LIM_DISC_ADV_INT_MAX, advInt);//BY ZCX 在限制发现模式下最大广播时间间隔
GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MIN, advInt);//BY ZCX 永久广播模式下最小广播时间间隔
GAP_SetParamValue(TGAP_GEN_DISC_ADV_INT_MAX, advInt);//BY ZCX 永久广播模式下最大广播时间间隔
}
// Setup the GAP Bond Manager
{
uint32_t passkey = 123456; // passkey "000000"
// uint8_t pairMode = GAPBOND_PAIRING_MODE_WAIT_FOR_REQ;//BY ZCX 等待配对请求
uint8 pairMode = GAPBOND_PAIRING_MODE_INITIATE;
uint8_t mitm = TRUE;
uint8_t ioCap = GAPBOND_IO_CAP_DISPLAY_ONLY;//BY ZCX 只有显示
uint8_t bonding = TRUE;
GAPBondMgr_SetParameter(GAPBOND_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey);//BY ZCX 默认密码
GAPBondMgr_SetParameter(GAPBOND_PAIRING_MODE, sizeof(uint8_t), &pairMode);//BY ZCX 配对模式
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);//BY ZCX 开启配对功能
}
// Initialize GATT attributes
GGS_AddService(GATT_ALL_SERVICES); // GAP
GATTServApp_AddService(GATT_ALL_SERVICES); // GATT attributes
DevInfo_AddService(); // Device Information Service
TI 员工,你好:
请问下“禁止了IO capacity,会使用just works完成配对”,如何配置做才会出现这个情况,
也就是说如何禁止了IO capacity?
连接与配对是两件事情,连接在配对之前。
不输入密码而能读写特征值,这是因为你的从机代码没有把特征值加密导致的。
详情看我个性签名档的博客地址,《CC2541之配对与绑定》。
那请问下,“正确密码为“123456”,但我输入如“0123456”、“12345678”、“0123456789”等这样的密码均可以正常连接通讯;但如果输入不包含正确密码,如“234656”这样的密码就会正常显示密码错误。”,这个问题是如何导致的?
不用管,特征值加密了就能正常。上面文章自己看。
TI员工,你好:
我的问题依然存在,希望指点下。你看看我的配置怎么导致IO capicity禁止的吧。
谢谢