Secure Simple Pairing,简称SSP,其流程主要分为六个部分:

  1. • IO capabilities exchange
  2. • Public key exchange
  3. • Authentication stage 1
  4. • Authentication stage 2
  5. LINK KEY CALCULATION
  6. LMP AUTHENTICATION AND ENCRYPTION

接下来将逐个介绍这个六个部分的内容。

IO capabilities exchange

在ssp的过程中,有两个角色:“Initiator ”和“Responder ”,他们是如何确认的呢?主动发起 IO capabilities exchange流程的那一方就是Initiator,而另一方就是Responder 。

IO capabilities exchange 是干嘛的呢?

在平常的配对中,有如下的场景:

  1. 手机和键盘配对,我们会被要求在键盘上面输入字符。
  2. 手机和音箱配对的时候,我们往往不需要额外的操作。
  3. 手机和手机的配对的时候,我们往往要在两只手机的屏幕上面都要点击一下配对。

上面的场景就是配对的设备之间经过IO capabilities exchange之后来确定了双方进行配对所选取的最合适的配对算法。配对算法有如下的几种:

  1. Numeric comparison
  2. Passkey entry
  3. Out of band

手机和键盘进行配对的场景就属于Passkey entry,而手机和音箱的配对属于Numeric comparison,Out of band 是属于带外数据的通信,这里基本用不到,不作细节介绍。

那么接下来的一个问题是:IO capabilities exchange 和配对算法的选取的具体的映射关系是什么样的呢?

请看下图:

上面这个图是根据设备的input和ouput的能力来归结出来的一个综合的IO能力,下面这张图是根据这个IO能力来选择不同的流程:

上面两张图都是比较容易理解的,这里举两个例子来说明一下(往往是如下的情况,并不绝对,严格来说还是要看IOcap):

initiator
responder
配对算法选取
TV 音箱

Numeric Comparison
with automatic confirmation
on both devices

TV 手机

Numeric Comparison:
Both Display, Both Confirm

TV 键盘

Passkey Entry: Initiator
Display,Responder Input.

最后看看这一流程的空中交互:

OIcap的整个流程图如下:

ssp的第二个阶段是Public key exchange

首先看一下这个部分流程图:

这里交换的public key其实设备自己生成的,还有一个screct key,这两者组成一对key。从上图可以看出,当得到了对方了public key之后就进行了DHKey的计算,DHKey最终会参与到link key的计算当中。

因为public key比较大,它是分多比包来传输的。从上图可以看出它是先传输的header部分,然后在传输palyload部分。

air log中该过程的交互如下:(下图只展示了responder-->initiator部分)

Authentication Stage 1

这一部分主要介绍两种配对协议:

  1. Numeric Comparison
  2. Passkey Entry Authentication

首先来看看

Numeric Comparison

这个配对协议的使用场景,上面已经分析过,这里再次重复一下。

  1. 当双方的设备都有output的能力的时候,比如两个手机进行配对,这个时候两只手机的界面需要用户去确认的。
  2. 当一方设备有output的能力,但是另一方设备是no input or output的时候,比如手机和音箱进行配对的时候,这种情况和上一种的情况的区别是不要用户去确认,这种情况其实也可以称为just work

下面从btsnoop中看一下两者的区别:下面是(TV和TV配对)

如果用户不去确认屏幕上面显示的value,那么最终就会出现LMP response timeout的错误:


而如果用户在屏幕上面点击取消配对的话,那么相应的log如下:

这边抓了一下air log发现,如是在确认界面直接点击取消配对的话,那么controller端是直接发送LMP Detach的报文,那么在对方的host就只会收到一个disconnection event。

在spec中规定是要下一次initiator进行DHKey check的时候,responder才通告验证失败:

以上是关于该协议的流程部分,下面看一下该协议的算法部分:

上面的图片都有注释,比较容易看懂,这里就不再过多解释。在配对章节的基本思想都是如下:

一方通过随机值rand与某个配对算法(之前协商好的)计算出一个confirm值,然后把rand值和confirm值发送给对方,让对方去check。

接下来看 这一阶段的另一个配对协议Passkey Entry Authentication

这个配对协议的典型应用场景就是键盘和TV的配对。

下面看一下其流程:

从上面的流程图可以看出来,其校验的套路还是一样,首先按照某种算法计算出confirm 值,并发送给对方,然后双方再交换各自参与计算confirm值的random值,然后依次使用对方发送过来的值进行计算看是否和对方发送过来的confirm值相等。

下面看一下 校验过程的详细流程图:

上面的流程图也很容易理解,参照上面的注释应该能看懂,这里不做过多注释。下面看一下该流程在air log中的表现:

下面是对应的btsnoop:

上面两张图是对应于按键的输入流程输入流程。输入完成之后开始计算:注意上面流程图显示了计算要计算20次,下图简单展示几次交互过程:

接下来看看Authentication Stage 2

这一阶段主要的工作就是DHKey的验证,这个流程非常的简单,如下:

DHKey校验完成之后,那么之后的流程就是要生成link key了。这里需要说明一下的是 DHKey是在前面进行public key交换之后就生成了。

下面来看看link 可以的生成过程:LINK KEY CALCULATION

其link key的计算算法如下:

我们可以看出,其中输入参数都是双方已经校验过的,并且参数是一致的,如果双方计算不出错的话,输出的link key也是一致的。

从上面的这个图可以看出来,双方计算了link key之后还会再进行一轮校验,以保证生成的link key确实是一样的。相应的air 中的情况如下:

到此link key就生成了,这个key标志着配对完成。之后只要两者没有删除link key,还是可以回连的。回连的流程就不会再走一系列的生成key的动作,而是直接验证link key。

最后来看看encryption的过程:

在air 中的交互如下:

上面的流程是生成KC,下面是key作用于数据包的示意图:

这个流程的意思就是通过link key以及一些其他的信息生成一个Kc,然后Kc又参与某种算法生成Kcipher,最终由这个key 对接下来发送的数据进行加密。这里要注意的是加密是针对于baseband层的payload,加密并不会对header进行加密。

到此ssp流程分析完毕。

蓝牙secure simple pair 概述的更多相关文章

  1. 蓝牙Legacy Pairing流程概述

    Legacy pairing 从名字上看可以知道它是老式设备采用的配对方法. 配对的最终目的是为了生成key,key可以给链路加密,保证双方设备通信的安全性.那配对流程的讲述其实就是key的生成过程. ...

  2. 低功耗蓝牙(BLE)——概述

    1. 概述   蓝牙协议是由SIG制定并维护的无线通信协议,蓝牙协议栈是蓝牙协议的具体实现.各厂商都根据蓝牙协议实现了自己的一套函数库--蓝牙协议栈,所以不同厂商的蓝牙协议栈之间虽然存在差别,但是都遵 ...

  3. 蓝牙(Bluetooth) IEEE 802.15.1 协议学习

    catalogue . 蓝牙概念 . 配对和连接 . 机密安全性 . 蓝牙协议分类 . 蓝牙协议栈 1. 蓝牙概念 蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网 ...

  4. [加密]ESP32 -Secure Boot 安全方案

    转自:https://blog.csdn.net/espressif/article/details/79362094 Secure Boot 功能概述 方案概述 Secure Boot 的目的是保证 ...

  5. wesome-android

    awesome-android Introduction android libs from github System requirements Android Notice If the lib ...

  6. Bluetooth GAP介绍

    目录 1 GAP协议栈 2 Profile Role 3 用户接口 4 模式 5 安全 5.1 认证(Authentication) 5.2 安全模式 6 Idle Mode Procedures 7 ...

  7. 在HCI层看从inquiry的整个过程

    一.概述    在windows下寻找远端蓝牙设备,从最开始的inquiry寻找设备,到连接设备,到最后配对完成,整个HCI层所发的command和event以及Data包可以反应整个蓝牙的inqui ...

  8. 现在的 Linux 内核和 Linux 2.6 的内核有多大区别?

    作者:larmbr宇链接:https://www.zhihu.com/question/35484429/answer/62964898来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转 ...

  9. 十、GAP

    1.1     背景 GAP(Generic Access Profile)位于主机协议栈的最顶层,用来定义BLE设备在待机或者连接状态中的行为,该Profile保证不同的Bluetooth产品可以互 ...

随机推荐

  1. C#在window服务配置Log4Net.dll

    1.使用背景: C#window服务下添加一个日志记录程序集(Log4Net.dll) 2.添加和使用步骤如下: 一.下载并引入Log4Net.dll程序集到项目中 下载地址:http://loggi ...

  2. 安卓 App 性能专项测试指标之 CPU 深度解析

    指标背景 很多场景下我们去使用App,可能会碰到手机会出现发热发烫的现象.这是因为CPU使用率过高.CPU过于繁忙,会使得整个系统无法响应用户,整体性能降低,用户体验变得相当差,也容易引起ANR等等一 ...

  3. Fiddler使用~知多少?

    昨天已经说了Fiddler的原理,那么今天就说说它是如何使用.我们进入正题. 在大多数网站测试的情况下,我们执行检测一个端口号或网址,这种场景一定会出现,记住,是一定会. 那么就需要我们过滤了,我们需 ...

  4. FileUtils【获取SD卡根目录、读写文件、移动、复制、删除文件、获取文件名、后缀名操作类】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装了获取SD卡根目录路径.以及对文件读写.获取文件名等相关操作. 因为需要用到android.permission.READ_EX ...

  5. LindAgile.SchedulingTask~设计一个不错的任务调度组件

    回到目录 SchedulingTask产生的原因 任务调试主要指定期执行某些任务代码,之前用过quartz,感觉有些重,使用时需要添加包包,配置管理项时,对于简单的项目用它就显得有些臃肿了,不如直接上 ...

  6. 精读《V8 引擎 Lazy Parsing》

    1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...

  7. Java中实现多线程的四种方式

    Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来创建Thread线程.使用ExecutorService.Cal ...

  8. 痞子衡嵌入式:恩智浦i.MXRT系列微控制器量产神器RT-Flash用户指南

    RT Flash English | 中文 1 软件概览 1.1 介绍 RT-Flash是一个专为基于NXP i.MX RT系列芯片的产品量产而设计的工具,其功能与官方MfgTool2工具类似,但是解 ...

  9. cocos creator主程入门教程(十一)—— 有限状态机和行为树

    五邑隐侠,本名关健昌,10年游戏生涯,现隐居五邑.本系列文章以TypeScript为介绍语言. 本篇介绍有限状态机和行为树.有限状态机用于有限的状态下的AI,由于同时只能处于一个状态,多个状态需要多个 ...

  10. GitHub 可以免费创建私人仓库啦

    如果你不知道什么是 GitHub,也可以往下看,只不过可能感受不会那么深啦. 昨天,GitHub 博客发表了文章 其中比较重要的已经用蓝色线标注了. GitHub 支持开发者创建免费私人仓库,但是需要 ...