第一部分:HCI协议(八)具体的HCI command和event(16、AUTHENTICATION AND ENCRYPTION 二)

2、Secure Simple Pairing

使用Secure Simple Pairing之前,首先需要用HCI command(HCI_Write_Simple_Pairing_-Mode)设置Secure Simple Pairing enable

Secure Simple Pairing分为4个阶段:

IO capabilities exchange:确定Authentication stage 1使用哪种算法

Public key exchange:交换public key

Authentication stage 1:根据IO capabilities exchange确定认证程序进行认证

Authentication stage 2:使用DHKey计算另一个confirmation value并通过这个confirmation value对两个设备进行验证

(1)IO capabilities exchange

发起IO capabilities的设备被称为Initiator,另外一个设备被称为Responder,这个角色在Secure Simple Pairing整个过程中都是固定的,不止是在IO capabilities过程中

IO capabilities exchange主要是为了确定两个设备的IO_Capability(确实设备支持DisplayOnly、DisplayYesNo、KeyboardOnly或者NoInputNoOutput)、OOB_Data_Present(确定是否有OOB数据)和Authentication_Requirements(确定Authentication stage 1阶段使用哪种认证算法)

Authentication stage 1时有3种认证程序:Out-of-Band procedure、Numeric Comparison procedure和Passkey Entry procedure

Out-of-Band procedure:两个设备中只要有一个设备的OOB_Data_Present为存在OOB数据,就使用这种算法

Numeric Comparison procedure:两种情况下使用:

两个设备的Authentication_Requirements都设置MITM Protection Not Required时使用;

两个设备中至少有一个设备的Authentication_Requirements设置为MITM Protection Required,同时两个设备的IO_Capability除了这种情况(其中一个设备是KeyboardOnly,另一个设备是DisplayOnly或者DisplayYesNo)以外的其他情况时使用

注意:还有一种是just work,跟Numeric Comparison实现是一样的,不过要求至少有一个设备是NoInputNoOutput,例如蓝牙耳机

Passkey Entry procedure:两个设备中至少有一个设备的Authentication_Requirements设置为MITM Protection Required,同时两个设备的IO_Capability为其中一个设备是KeyboardOnly,另一个设备是DisplayOnly或者DisplayYesNo时使用

关于oob数据是这样的:

A、正常情况的IO capabilities exchange

B、异常情况的IO capabilities exchange

master和slave同时发起LMP_io_capability_req

这时候以master的为准,master需要使用LMP_not_accepted_ext(0x23-Transaction Collision)来拒绝slave的LMP_io_capability_req

(2)Public Key Exchange

Public key分为P-192和P-256两种

当两个设备都支持Secure Connections时,用P-256,否则用P-192

因为public key很长,一个DM1包放不了,所以要分多次传输(先发送LMP_encapsulated_header,然后再发送多个LMP_encapsulated_payload),并且Initiator先发送完以后,Responder才可以发送,得到public key以后,就会计算DHKey(这个是Authentication stage 2时用的)

(3)Authentication stage 1

Authentication stage 1时有3种认证程序:Out-of-Band procedure、Numeric Comparison procedure和Passkey Entry procedure

Numeric Comparison procedure的流程:

A、Responder计算一个C值,然后通过LMP_simple_pairing_confirm发送给Initiator;

B、Initiator收到LMP_simple_pairing_confirm以后就会通过LMP_simple_pairing_number发送一个随机数据给Responder,Responder回复LMP_accepted;

C、然后Responder会使用LMP_simple_pairing_number发送自己的随机数给Initiator

D、Initiator通过Responder的随机数计算出C值来,如果和LMP_simple_pairing_confirm里面的C值一样,则回复LMP_accepted,然后两个设备分别生成confirm value通知用户是否接受配对。如果计算出来的C值和LMP_simple_pairing_confirm里面的C值不一样

E、如果两边都是接受那就进入Authentication stage 2

F、如果Initiator的用户不接受,Initiator直接发送LMP_numeric_comparison_failed

如果Responder不接受,则会等到Authentication stage 2收到LMP_Dhkey_check时,回复LMP_not_accepted

Passkey Entry Authentication:

A、public key exchange以后,IO capability为KeyboardOnly的设备的host会收到HCI_User_Passkey_Request(假如为Responder),另一个IO capability为DisplayOnly或DisplayYesNo的设备会收到HCI_User_Passkey_Notification显示一个passkey(假如为Inititor),然后Responder会输入paskey

B、Responder发送HCI_Send_Keypress_Notification(Notification _Type=Entry started)表示输入开始,Responder发送HCI_Send_Keypress_Notification (Notification _Type=Entry Completed )表示输入结束。

C、Responder发送HCI_User_Passkey_Request_Reply将输入的passkey发送给controller,如果Responder没有输入passkey或者拒绝配对则Responder会发送HCI_User_Passkey_Request_Negative_Reply给controller,当Initiator发送LMP_simple_pairing_confirm时,Controller就会直接回复LMP_not_accepted

如果IO capability为KeyboardOnly的设备是Inititor,则controller可以发送LMP_passkey _entry_failed直接结束配对

D、IO capability为DisplayOnly或者DisplayYesNo的设备(假如为Initiator)发送LMP_simple_pairing_confirm

E、Responder发送LMP_simple_pairing_confirm

F、Initiator通过LMP_simple_pairing_number发送自己的随机数给Responder,Responder收到后计算出C值判断是否和收到的LMP_simple_pairing_confirm里面的一样,如果一样则回复LMP_accepted,如果不同则回复LMP_not_accepted

G、Responder回复LMP_accepted以后,会把自己的随机数通过LMP_simple_pairing_number发送给Initiator,然后Initiator计算C值,并判断是否和收到的LMP_simple_pairing_confirm里面的C值相同,如果相同则回复LMP_accepted,如果不同则回复LMP_not_accepted

重复D-G的步骤20次

Out-of-Band procedure

没看懂暂时不解释

(4)Authentication stage 2: DHKey Check

在这个步骤,两个设备都会计算一个confirmation value,使用confirmation value进行验证

A、Initiator将计算出来的confirmation value使用LMP_DHKey_check发送给Responder

B、Responder验证这个值是否正确,如果不正确则回复LMP_not_accepted

C、正确则回复LMP_accepted,同时使用LMP_DHKey_check发送自己计算出来的confirmation value给Initiator

D、Initiator也会验证Responder的confirmation value是否正确。如果不正确则回复LMP_not_accepted

E、如果正确,则回复LMP_accepted

F、然后Initiator和Responder分别计算link key,同时通过HCI_Simple_Pairing_Complete通知host配对完成,之后进行认证的过程。

注意:如果两个设备都支持Secure Connections (Controller Support) and the Secure Connections (Host Support) features就进行安全认证,否则进行传统认证。认证完成后才会通过HCI_Link_Key_Notification将link key发送给host

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值