ble协议栈从零开始八(security manager 最细致分析上)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/XG_2013/article/details/80784047

一、前言

ble协议栈最难的一章来了,我尽自己的努力把这一章写好。安全管理就是使用秘钥的分配方法来识别和加密链路,简单的说SM提供了一个配对的方法,让MASTER和SLAVE(配对是在建立连接过后的动作)拥有一对key,以后的数据链路的交互可以用这个key加密和解密报文。原理看上去很简单,就是为了获得这个key。

但是:

1)如何生成这个key呢?

2)如何告诉对方自己的key呢?还能不被别人窃取?

大家带着疑问,看下面的内容吧!!

二、配对的过程

• Phase 1: Pairing Feature Exchange

交换一些特征值,已决定在下一个阶段配对的方法,比如一个设备是蓝牙4.0的不支持(LE Secure Connections),另一个设备支持LE Secure Connections,那么结果下一阶段肯定是LE legacy pairing的方法。再比如一个设备不支持按键,另外一个设备支持按键,那么在配对的过程就不能是密码输入的方式进行鉴权。

• Phase 2 (LE legacy pairing): Short Term Key (STK) Generation

以前的遗留的配对方式,主要是为了向下兼容

• Phase 2 (LE Secure Connections): Long Term Key (LTK) Generation

安全连接的方式,采用椭圆曲线加密的方式极大加强了设备链路安全性

• Phase 3: Transport Specific Key Distribution

这个过程是可选的,配对过后的链路是安全的,此时可以共享一些秘钥(比如 IRK等)。看完这个大家肯定很晕,那么直接结合具体配对流程来分析。

2.1、pairing Feature Exchange

    先看authreq,它是authentication requirements 的缩写,它决定后续的配对的方法的如下

       1 ) 后续的配对是legacy pairing还是 security connection pairing

       2 ) 是否使用man-in-the-middle protection (MITM中间人保护的方式)

       3)是否bond

   OOB data flag,它是标志能否使用out of band(带外)的方式鉴权

   IO capability,它是如果使能中间人保护的方式,根据IO口的能力决定具体那一中中间然方式

   init key distribution,在第三阶段分发的initiator方的秘钥

   resp key distribution,在第三阶段分发responder方的秘钥

   encrypt  key size ,每一个设备都应该最大的加密字节的数,还有一个最小的字节的数。这个参数在5-16。

下图是nordic的交互feature的源码。

      

总结:pairing feature exchange,

1)先判断是legacy pairing还是connection pairing

2 )判断支不支持OOB的方式鉴权,支持就使用OOB的方式鉴权

3 )如果不支持OOB的方式鉴权,判断支不支持MIM的方式

4)如果支持MIM的方式,通过IO capability选择一个方式,

    (1)passkey entry (2)numeric comparsion (3)just work


5 )否则就是不鉴权,justwork

3.1、legacy pairing 过程


整个过程都是很简单,根据第一步假设已经确定了是legacy pairing方式。双方都创建Temporary Key (TK): a 128-bit temporary key ,如果鉴权方式是just work,TK的值为0,或者是输入的密码或者带外信息。最终生成的STK = s1(TK,Srand,Mrand),s1是加密算法。

3.1、security connection pairing 过程

第一步还都是交换特征值,确定为security connection pairing 配对,然后在决定鉴权方式。本文就是passkey entry方式进行说明。

stage 1:双方交换公钥


首先 initiating 设备和 non-initating设备都要生成一对秘钥(公钥和私钥),这个公钥和私钥是有相关性的。我们把公钥相互交换。双方利用自己的私钥和对方的公钥,运用椭圆曲线加密的方式生成DHkey,这个值是相同的,这个就椭圆曲线对称加密的奥秘之处。假设有个窃听者即使获取Pka和Pkb,它也无法生成相同的DHkey。

stage 2:鉴权阶段,分为numeric ,just work,passkey,outoufband,本文就以passkey entry为例,进行阐述


这个过程感觉有点繁琐啊,首先initiating设备给nor-inititing设备展示一个密码ra,nor-inititing设备输入这个密码rb。

ra = rb是一个6位数的短的密码,可分为20bit(ra = ra1|ra2|...ra20,rb = rb1|rb2..rb20)。步骤3到步骤8需要重复20次(即密码的位数),第一次,选择ra1和rb1,双方生成一个随机数128位nounce,na1和na2。双方各自生成各自的检验值

ca1  = f4(Pka,Pkb,na1,ra1),ca2 =  f4(Pka,Pkb,nb1,rb1),比较双方的ca1和ca2只有随机数na1和na2,不相同,只要在后面交换na1和na2就能验证其他的参数是相同的,如果其他的参数相同,鉴权成功。重复20次。

stage 3:LTK生成

如上图 mackey || ltk = f5(DHkey,NA,NB,A,B)只要保证DHkey相同,就能在Ea和Eb的验证没问题。好至此我们获取了LTK的值了


到此为止,le legacy pairing我们获得了STK,le security connection pairing我们获得LTK。


三、各种key 

1、IRK之前已经说出了,是解析resolvable random address

2、Connection Signature Resolving Key (CSRK)是一个128bit的用于对数据的签名,和校验签名

3、Long Term Key (LTK) 用于产生contributory session key用于链路层的数据加密

4、Encrypted Diversifier (EDIV) 是一个16bit的值,用来识别在legacy pairing生成的LTK,每次生成Encrypted Diversifier (EDIV) 都会有一个独一无二的LTK

5、Random Number (Rand)是一个64位的值,用来识别在legacy pairing生成的LTK,每次生成Encrypted Diversifier Random Number (Rand) 都会有一个独一无二的LTK




 

猜你喜欢

转载自blog.csdn.net/XG_2013/article/details/80784047