SYD8801密码加密配对【安全参数的设置说明】
SYD8801是一款低功耗高性能蓝牙低功耗SOC,集成了高性能2.4GHz射频收发机、32位ARM Cortex-M0处理器、128kB Flash存储器、以及丰富的数字接口。SYD8801片上集成了Balun无需阻抗匹配网络、高效率DCDC降压转换器,适合用于可穿戴、物联网设备等。具体可咨询:http://www.syd-tek.com/
SYD8801密码加密配对
SYD8801作为从机,按照规范说明可发起SecurityReq,然后主机将进入配对流程。
SecurityReq函数定义如下:
uint8_t SecurityReq(uint8_t flag, uint8_t mitm);
其中flag和mitm属于规范中的内容,如下说明:
这些都是协议栈的内容,一般不用关心,只要记得传入1,0即可。
此篇博客是针对密码加密的情况,所以在配对过程中协议栈会上报一个事件来获取密码:
这里设置密码为123456!
加密成功后会进入上图的“else if(p_evt->evt_code == GAP_EVT_ENC_KEY)”分支!
如下为安卓手机的测试流程截图(注意这里有两次配对流程,第一次确认配对,第二次输入密码):
下面是IOS的配对流程:
http://download.****.net/download/chengdong1314/10237965
安全参数的设置说明
在ble_init协议栈初始化函数中会调用SetSecParams函数初始化安全参数,比如如下代码:
struct smp_pairing_req sec_params;
/* security parameters */
sec_params.io = IO_NO_INPUT_OUTPUT;
sec_params.oob = OOB_AUTH_NOT_PRESENT;
sec_params.flags = AUTHREQ_BONDING;
sec_params.mitm = 0;
sec_params.max_enc_sz = 16;
sec_params.init_key = 0;
sec_params.rsp_key = (SMP_KEY_MASTER_IDEN |SMP_KEY_ADDR_INFO);
SetSecParams(&sec_params);
其中smp_pairing_req结构体定义如下:
/*************************************************************************************************
*结构体名:gap_pairing_req
*成员: io 配对过程中的IO能力,为枚举GAP_IO_CAPABILITY成员
oob 配过过程中是否需要ODB,为枚举GAP_OOB_FLAG成员
flags 配对过程中是否需要绑定
Bonding_Flags |
b1b0 | Bonding Type
--------------|------------------
00 | No Bonding
01 | Bonding
10 | Reserved
11 | Reserved
mitm 配对过程中是否需要中间人保护set to one if the device is requesting MITM protection,
otherwise it shall be set to 0
rsvd 保留位
max_enc_sz 配对过程中最大的密匙长度,The maximum key size shall be in the range 7 to 16 octets.
init_key 配对过程中初始者(主机)分配的密匙
rsp_key 配对过程中从机分配的密匙
*说明: SYD8801的安全参数在启动的时候调用api:SetSecParams进行设置,在配对开始的时候调用api:security_req开始配对流程,其中gap_s_security_req函数也有flags和mitm两个参数,这两个参数和安全参数里的参数有冲突,这里优先使用调用gap_s_security_req传入的函数
**************************************************************************************************/
struct smp_pairing_req{
uint8_t io;
uint8_t oob;
uint8_t flags:2;
uint8_t mitm:1;
uint8_t rsvd:5;
uint8_t max_enc_sz;
uint8_t init_key;
uint8_t rsp_key;
};