蓝牙核心规范(V5.2)7.8-深入详解之SMP(安全管理协议)(1)
1.概述
安全管理协议属于端到端的协议,用来生成加密秘钥和 身份密匙,它定义了一个简单的匹配和密匙分发协议,并提供协议栈的其他层与设备安全地链接和交换数据。
安全管理协议为低功耗系统独有的,在经典蓝牙系统中,安全管理协议包含在控制器的链路管理器模块中。在低功耗系统中,安全管理协议被移至主机部分,位于链路控制和适配协议之上,降低控制实现成本的同时提高了主机灵活性。但是,包发送之前的数据加密依旧是在控制器中进行。
2.安全管理
安全管理器(SM)使用密钥分发方法来执行无线电通信中的身份和加密功能。这意味着每个设备都会生成并控制其分发的密钥,并且没有其他设备会影响这些密钥的生成。密钥的强度与在分发设备内实现的算法一样强。
该安全体系结构被设计为使响应设备的内存和处理要求低于启动设备的内存和处理要求。
执行配对以建立密钥,然后可以用来加密链接。然后执行特定于传输的密钥分发来共享密钥,这些密钥可用于在未来的重新连接中加密链接、验证签名数据和随机地址解析。
配对三个阶段:
第1阶段:配对功能交换
第2阶段(LE遗留配对):短期密钥(STK)生成
第2阶段(LE安全连接):长期密钥(LTK)生成
第3阶段:传输特定密钥分配
设备应首先在配对功能交换中交换认证要求和IO能力,以确定在第二阶段应使用以下哪种方法:
- 仅工作阶段
- 数值比较(仅针对LE安全连接)
- 密码条目
- 带外(OOB)
从配对功能交换中检索到的身份验证要求还可以确定是否使用LE安全连接或LE遗留配对。
可选地,第3阶段可能用于分发特定的运输密钥,例如身份解决密钥(IRK)值和身份地址信息。 第1阶段和第3阶段是第2阶段使用的方法的相同规则。
第3阶段仅在链接上执行,其中使用加密:
- 使用LE遗产对或在第2阶段生成的STK
- 使用LE安全套接字或在第2阶段生成的LTK
- 使用BR/EDR配对生成共享链接密钥
第1阶段和第2阶段可以在链接上执行,链接可以是加密的也可以是未加密的。
2.2 密码工具箱
为了支持随机寻址,配对和其他操作,SM提供密码功能工具箱。 定义了以下密码功能:
- ah用于创建随机地址创建和解析中使用的24位散列。
定义了以下加密功能以支持LE传统配对过程:
- c1用于在配对过程中使用的生成确认值。
- s1用于在配对过程中生成STK。
定义了以下加密功能以支持LE安全连接配对过程:
- f4用于在配对过程中生成确认值。
- f5用于在配对过程中生成LTK和MacKey
- f6用于在验证过程的第2阶段生成检查值。
- g2用于在配对过程的认证阶段1期间生成6位数字比较值。
- h6用于从安全连接导出的BR/EDR链路生成LE LTK,并用于从安全连接导出的LE LTK生成BR/EDR链路键。
- h7用于生成从安全连接导出的BR/EDR链路密钥生成LE LTK的中间密钥和从安全连接导出的LE LTK生成的BR/EDR链路密钥。
加密功能的构建块ah,c1和s1是安全功能e。
在f4内, f5, f6, 当使用多字节整数参数输入AES-CMAC时,使用了g2,h6和h7函数,其中整数的最重要的八分之一是流的第一个八分之一,整数的最重要的八分之一是流的最后八分之一。 这些功能内的AES-CMAC输出是多字节整数,其中第一个字节是MSB,最后一个字节是该整数的LSB。
2.2.1 安全功能e
使用FIPS-197中定义的AES-128位块cypher,从128位密钥和128位明文数据生成128位加密数据。
加密数据=e(秘钥,明文)
与键对应的最重要的字节[0],与[0]对应的明文的最重要字节以及使用FIPS-197中指定的符号输出[0]的加密数据的最重要字节。
注意:安全功能可以在主机上实现,也可以使用HCI_LE_Encrypt命令实现。
2.2.2 随机地址散列函数ah
随机地址散列函数用于生成散列值,该散列值用于可解决的私人地址。
以下是对随机地址散列函数的输入:
- k是128位
- r是24位
- 填充是104位
r与padding连接到生成r‘,因为128位输入参数plaintextData用于安全函数e:
r‘=padding || r
例如,如果24位值r为0x423456,则r‘为0x00000000000000000000000000000000423456。
随机地址函数ah的输出是:
ah(k, r) = e(k, r’) mod 2^24
然后,安全功能的输出被截断为24位,因为输出的最后24位是ah的结果。
2.2.3 LE传统配对确认值生成函数c1
在整个LE传统配对过程中,确认价值已经交换。 此确认值生成函数c1用于生成确认值。
- k是128位
- r是128位
- preq是56位
- preq是56位
- iat是1位
- ia是48位
- rat是1位
- ra是48位
- padding是32位或0
iat与0的7位连接到创建iat‘,长度为8位。 iat是iat的最重要的位。
pres,preq,rat‘和iat’连接到生成p1,其中XORed为r,并使用128位输入参数plaintextData作为安全函数e:
p1 = pres || preq || rat’ || iat
ra连接到ia并填充生成p2,其中XORed具有安全功能的结果,并且使用p1作为输入参数明文,然后使用128位输入参数plaintextData作为安全函数e:
p2 = padding || ia || ra
确认值生成函数c1的输出是:
c1 (k, r, preq, pres, iat, rat, ia, ra) = e(k, e(k, r XOR p1) XOR p2)
安全函数的128位输出并用作确认值生成函数c1的结果。
例如,如果128位k为0x0000000000000000000000000000000000000000,128位值为0x5783D52156AD6F0E6388274EC6702EE0,128位值为0x05000800030207071000010000000。
2.2.4 LE传统配对的秘钥生成函数
秘钥生成函数s1用于在LE传统配对过程中生成STK。
以下是对秘钥产生函数s1的输入:参数:
- k是128位
- r1是128位
- r2是128位
最重要的64位r1被分配给生成r1‘,最重要的64位r2被分配给生成r2’。
例如,如果128位值r1为0x000F0E0D0C0B0A091122334455667788,则r1‘为0x1122334455667788。 如果128位值r2为0x010203040506070899AABBCCDDEEFF00,则为0x99AABBCCDDEEFF00。
r1‘与r2’连接以生成r‘which,因为128位输入参数plaintextData用于安全函数e:
r’ = r1’ || r2’
例如,如果64位值r1‘是0x1122334455667788,r2’是0x99AABBCCDDEEFF00,那么r‘是0x112233445566778899AABBCCDDEEFF00。
秘钥生成函数s1的输出是:
s1(k, r1, r2) = e(k, r’)
安全函数的128位输出并用作秘钥生成函数s1的结果。
例如,如果128位值k为0x00000000000000000000000000000000000000000000。
128位值r‘是0x11223344566778899AABBCCDDEEFF00。
然后从秘钥生成函数s1输出为0x9a1fe1f0e8b0f49b5b4216ae796da062。
2.2.5 函数AES-CMAC
RFC-4493定义了基于网络的消息身份验证代码(CMAC),该代码将AES-128用作块共享函数,也称为AES-CMAC。
输入参数:
- m是经过验证的变量长度数据
- k是128位密钥
128位消息身份验证代码(MAC)是作为以下内容生成的:
MAC = AES-CMACk(m)
设备可以在主机上实现AES功能,也可以使用HCI_LE_Encrypt命令命令在控制器上使用AES功能。
2.2.6 LE安全连接确认值生成函数f4
在LE安全连接配对过程中,将交换确认值。 这些确认值使用确认值生成函数f4计算。
此确认值生成函数使用MAC函数AES-CMACX,秘钥为128位X。
函数f4输入:
- U是256位
- V是256位
- X是128位
- Z是8位
Z是数字比较和OOB协议的零(即8位零)。 在Passkey Entry协议中, 最重要的Z位等于一个,最重要的位是由passkey的一位制成的,例如,如果passkey位是1,那么Z=0x81,如果passkey位是0,那么Z=0x80。
U,V和Z连接并用作对AES-CMAC函数的输入m,X用作密匙k。
对f4的输入取决于不同的关联模型:
PKax表示A的公钥PKa的x坐标。同样,PKbx表示B的公钥PKb的x坐标。Nai是该轮的第十一个值。 对于圆形奈值是一个新的128位数。 同样,rai是passkey的一位值,扩展为8位( 0x80或0x81)。
Na和Nb不是来自设备A和B.ra,rb是设备A和B产生的随机值。
确认值生成函数f4的输出如下:
f4(U, V, X, Z) = AES-CMACX (U || V || Z)
Z的最重要字节是AES-CMAC输入消息m的最重要字节,U的最重要字节是AES-CMAC输入消息m的最重要字节。
2.2.7 LE安全连接确认值生成函数f5
使用具有128位密钥T的MAC功能AES-CMACT定义此关键生成函数。
f5函数输入参数:
- W是256位
- N1是128位
- N2是128位
- A1是56位
- A2是56位
T = AES-CMAC (W)
SALT是128位值:
0x6C88 8391 AAF5 A538 6037 0BDB 5A60 83BE
计数器,keyID,N1,N2,A1,A2和Length连接并用作对AES-CMAC功能的输入,T用作秘钥。 计数器是一个bit。 长度是两个bit。
字符串“btle”使用扩展的ASCII映射到密钥ID,如下所示:
keyID[0] = 0110 0101
keyID[1] = 0110 1100
keyID[2] = 0111 0100
keyID[3] = 0110 0010
keyID = 0x62746C65
秘钥生成函数f5的输出如下:
f5(W, N1, N2, A1, A2) = AES-CMACT (Counter = 0 || keyID ||N1 || N2|| A1|| A2|| Length = 256)||AES-CMACT (Counter = 1 || keyID || N1 || N2|| A1|| A2
|| Length = 256)
LTK和MacKey计算如下:
MacKey || LTK = f5(DHKey, N_master, N_slave, BD_ADDR_master, BD_ADDR_slave)
DHKey是在LE Secure Connections第2阶段期间生成的共享秘密Diffie-Hellman密钥。
N_master是主机给主机的排名号,N_slave是从机给主机的排名号。
BD_ADDR_master是闸机口的设备地址,BD_ADDR_slave是从机的设备地址。 设备地址是使用的值持久连接设置。 如果地址是随机地址,则BD_ADDR_master和BD_ADDR_slave中最重要的字节中的最重要位设置为1,如果地址是公共地址,则设置为0。 BD_ADDR_master和BD_ADDR_slave中最重要bit的7个最重要位元设置为0。
LTK是f5的最重要的128位(计数器=1)。 MacKey是f5的最重要的128位(Counter=0)。
可以使用HCI_LE_Generate_DHKey命令在主机上实现差异化的Hellman密钥生成,也可以使用HCI_LE_Generate_DHKey命令在控制器上生成密钥。
注意:当您使用HCI_LE_Generate_DHKey命令时,设备只能按时远程设备。
2.2.8 LE安全连接检查值生成函数f6
使用128位W的MAC函数AES-CMACW定义f6函数。
f6函数的输入参数
- W是128位
- N1是128位
- N2是128位
- R是128位
- IOcap是24位
- A1是56位
- A2是56位
N1,N2,R,IOcap,A1和A2连接并用作对AES-CMAC功能的输入,W用作秘钥。
对f6的输入取决于不同的关联模型:
MacKey是f5输出的128位MSB。
Na是主机给从机的序列号,Nb是从机给主机的序列号。
IOcapA是主机的能力,IOcapB是从机的能力。 IOcapA和IOcapB是三个字节中最重要的字节作为AuthReq参数,中间字节作为OOB数据标志,最重要的字节作为IO能力参数。 AuthReq,OOB数据标志和IO能力参数存在于配对请求和配对响应 SMP包中。
在Passkey Entry中,ra和rb是以128位整数表示的6位passkey值。 对于实例,如果6位数的ra值为131313,则为
ra = 0x 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 f1
A是主机的设备地址,B是从机的设备地址。 如果地址是随机地址,则A和B中最重要的字节中的最重要位设置为1,如果地址是公共地址,则设置为0。 A和B中最重要的八位字节中最重要的7位设置为0。
检查值生成函数f6的输出如下:
f6(W, N1, N2, R, IOcap, A1, A2) = AES-CMACW (N1 || N2 || R || IOcap || A1 || A2)
2.2.9 LE安全连接数字比较值生成函数g2
输入参数:
- U是256位
- V是256位
- X是128位
- Y是128位
数字比较值生成函数g2的输出如下:
g2(U, V, X, Y) = AES-CMACX(U || V || Y) mod 2^32
2.2.10 链接秘钥转换函数h6
函数h6用于从一个秘钥类型转换为具有等效强度的另一个秘钥类型大小的秘钥。
使用128位密钥W的哈希函数AESCMACW定义h6函数。
输入参数:
- W是128位
- keyID是32位
keyID用作对AES-CMAC哈希函数的输入,W的最重要128位用作秘钥k。
h6的输出如下:
h6(W, keyID) = AES-CMACW(keyID)
2.2.11 链接秘钥转换函数h7
h7函数makes的定义使用具有128位SALT键的哈希函数AESCMAC(SALT)。
//注:(SALT是下标)
函数输入参数
- SALT是128位
- W是128位
W用于输入哈希函数AES-CMAC,SALT用作秘钥k。
h7的输出如下:
h7(SALT, W) = AES-CMACSALT(W)
- 点赞
- 收藏
- 关注作者
评论(0)