我写博文的目的大多数情况下都只是为研发工作复盘,记录研发工作中碰到的一些问题及最终解决方案或处理方式,也正因为如此,很多博文会显得很杂,甚至没有明显的主体。这篇博文的目的更是如此,说白了就是给自己看的,如果能对碰到类似问题的朋友提供那怕一点点的思路,那就是意外之喜了。
配对及加密,对沁恒的蓝牙的应用开发者来说,能做的事情其实很少,毕竟这部分内容都已打包在库里,我们几乎没办法修改。能做的不过是修改相关设置来满足我们的需要。尽管如此,我们还是先了解一下相关的知识。
沁恒CH582作为国产低功耗蓝牙SOC芯片,其配对与加密流程符合蓝牙4.2/5.0核心规范,本文将从实践角度解析其安全机制实现。
一、配对流程三阶段
-
配对特征交换
-
通过
GAP Bonding过程交换IO能力(如是否支持显示屏/键盘) -
典型配对方式:PIN码配对(默认6位数字)或Just Works(无用户交互)
-
-
临时密钥生成
-
支持LE Legacy Pairing和LE Secure Connections
-
基于DHKey的ECDH椭圆曲线加密(当启用Secure Connections时)
-
-
长期密钥分发
-
生成并交换LTK(Long Term Key)用于后续加密
-
可选的IRK(Identity Resolving Key)和CSRK(Connection Signature Key)
-
二、加密配置实践
uint32_t passkey = DEFAULT_PASSCODE;
uint8_t pairMode = GAPBOND_PAIRING_MODE_INITIATE;
uint8_t mitm = DEFAULT_MITM_MODE;
uint8_t ioCap = DEFAULT_IO_CAPABILITIES;
uint8_t bonding = DEFAULT_BONDING_MODE;
uint8_t key = 0x33;
GAPBondMgr_SetParameter( GAPBOND_CENT_DEFAULT_PASSCODE, sizeof(uint32_t), &passkey );
GAPBondMgr_SetParameter( GAPBOND_CENT_PAIRING_MODE, sizeof(uint8_t), &pairMode );
GAPBondMgr_SetParameter( GAPBOND_CENT_MITM_PROTECTION, sizeof(uint8_t), &mitm );
GAPBondMgr_SetParameter( GAPBOND_CENT_IO_CAPABILITIES, sizeof(uint8_t), &ioCap );
GAPBondMgr_SetParameter( GAPBOND_CENT_KEY_DIST_LIST, sizeof(uint8_t), &key );
GAPBondMgr_SetParameter( GAPBOND_CENT_BONDING_ENABLED, sizeof(uint8_t), &bonding );
很明显,GAPBOND_CENT_DEFAULT_PASSCODE,从名称就知道用于设置缺省密码。GAPBOND_CENT_PAIRING_MODE用于设置配对方式,从官方SDK中我们知道,有三种配对方式 :
GAPBOND_CENT_MITM_PROTECTION简单说就是用于设置是否需要密码,GAPBOND_CENT_IO_CAPABILITIES简单说就是设定配对绑定时,是否有输入输出相关设备。GAPBOND_CENT_KEY_DIST_LIST设置SM Pairing Request中的InitiatorKey(发起方密钥)及ResKey(响应方密钥)。
GAPBOND_CENT_BONDING_ENABLED用于设置配对时是否绑定,如果设置为TRUE,最好修改config.h中的BLE_SNV 为 TRUE。否则可能在重连已配对过的设备时,会出现连接上后立即断开等现象。
有关BLE 安全SM协议,有兴趣的可以参考:

最低0.47元/天 解锁文章
2158

被折叠的 条评论
为什么被折叠?



