(二)认证Authentication
1、蓝牙支持两种认证程序(authentication procedure):
传统认证(legacy authentication)和安全认证(secure authentication)
传统认证(legacy authentication):两个设备不都支持Secure Connections (Controller Support)和Secure Connections (Host Support) features,并且本地设备支持legacy authentication时使用;
安全认证(secure authentication):两个设备都支持Secure Connections (Controller Support)和Secure Connections (Host Support) features时使用
2、传统认证分析
解释:传统认证就是验证者发送一个包含随机数的LMP_au_rand PDU给被验证者,被认证者使用这个随机数、自己的BD_ADDR和link key(两个设备共享的)进行计算,然后将结果回复给验证者,验证者检测这个结果是否符合要求
具体的实现如下图所示:
验证者(Verifier)发送一个随机数RAND给被验证者(Claimant),被验证者使用E1算法,将key(link key),IDB(被验证者的地址)和RAND进行计算得到SRES,然后将这个值回复给验证者,验证者自身也会使E1算法,将key(link key),IDB(被验证者的地址)和RAND进行计算得到SRES’,然后检测SRES是否等于SRES’,等于则认证成功,否则失败
注意:link key是通过配对得到的。
更详细的图示:
3、安全认证分析
解释:安全认证时,A和B两个设备都是验证者也都是被验证者,A发送给B一个随机数AU_RANDm、B发送给A一个随机数AU_RANDs,A设备通过h4算法将link key、字符串”btdk”、A设备地址BD_ADDRm、B设备地址BD_ADDRs进行计算,算出一个Authentication Key,然后再使用h5算法,将Authentication Key、AU_RANDm、AU_RANDs进行计算,算出SRESm和SRESs,同样设备B也会通过上面的方法算出SRESm和SRESs,然后两个设备互相进行验证(A把SRESm发送给B,B把SRESs发送A)
如下图所示:
更详细的图示:
注意:link key是通过配对得到的。
4、认证失败错误提示:
如果传统认证和安全认证失败,则错误提示Authentication Failure(0x5);
如果没有被验证者没有link key,则错误提示PIN or Key Missing (0x06);
5、两个设备都有link key的认证如下图所示:
安全认证
普通认证
(三)加密Encryption
1、有两种加密方式:E0 encryption (即传统加密方式)和AES-CCM encryption
E0 encryption (即传统加密方式):两个设备不都支持Secure Connections (Controller Support)和Secure Connections (Host Support) features,并且encryption是enabled时使用;
AES-CCM encryption:两个设备都支持Secure Connections (Controller Support)和Secure Connections (Host Support) features时使用,并且encryption是enabled时使用;
2、有五种key分别是:
combination key KAB
unit key KA
initialization key Kinit
temporary key Kmaster
encryption key Kc
Kinit、KA、KAB都是普通配对过程中产生的,KA和KAB是两种不同类型的link key,Kinit是用来产生KA和KAB的;
Kmaster只能用于当前session中,是用来暂时代替link key的,当master想要同时对超过2个slave使用相同的encryption key的时候,Kmaster就会被使用,广播的时候用可不用关注。
Kc是加密过程中使用的,Kc是通过E3算法将link key、96-bit COF和128-bit random number处理后产生的(COF根据link key的不同产生方法也不同,link key是Kmaster则通过master 的BD_ADDR产生,如果不是,则COF就等于认证过程中产生的ACO—上面认证过程的图中有产生)
3、加密过程:
A、首先master和slave要确定是否可以加密,使用LMP_encryption_mode_req
B、确定加密key的size,使用LMP_encryption_key_size_req
C、开始加密,使用LMP_start_encryption_req
D、结束加密,使用LMP_stop_encryption_req
注意:加密中可能会有暂停加密和恢复加密,具体参考协议