broadlink协议分析


原文:Broadlink smart home devices complete protocol hack

链接:https://blog.ipsumdomus.com/broadlink-smart-home-devices-complete-protocol-hack-bc0b4b397af1

在smart home diy 网站上,有人研究如何将智能设备加入自己的DIY smart home hub上。第一个添加就是broadlink设备。作者最终实现的是用自己的代码来控制博联设备。文章对broadlink的协议部分进行了介绍,并给出了控制设备的node.js源码。
Step1 配置和配对
长按reset按钮,直到蓝灯快闪。
这时出现了名为BroadlinkProv的wifi热点。这就是配置访问点。

Step2 逆向broadlink协议
broadlink使用的是QUIC UDP协议进行交互。QUIC有两个工作选项,public和not public。不同点在于消息的第一个字节的第二个比特。
所有的消息可以广播发送或发送到指定ip地址。broadlink使用80端口交互(应该是设备端口是80)。

broadlink 消息结构
当public bit被设置为0,也就是low public flag,消息结构如下:

public flag : 0x00
public number: 0x00
payload
当public bit被设置为1,也就是high public flag,消息结构如下:

public flag:0x5a( Version:No, Reset:Yes, CID:0x2,Packet #1, Multipath:Yes)
Connection ID:24113000182295205 (0xa5aa555aa5aa5500)
Tag:0x00
Tag ID:0x00
padding:为0x00
payload(从第18个字节开始)

broadlink消息的头部将紧跟QUIC的头部,并有如下结构:
对于low public flag实际上是没有broadlink头部的。
对于high public flag,头部信息。
对于public消息,整个broadlink头部长度是56字节。
bytes 32-33(0x20-0x23)总是整个消息的checksum。对数据进行所有操作(包括加密)后进行计算。 通过使用0xbeaf的Magic完成校验和计算。
然后在字节36-37(0x24)为设备ID。Ipsum Domus使用0x7D00,Broadlink值如下:
0: 'SP1'; 
0x2711: 'SP2'; 
0x2719 or 0x7919 or 0x271a or 0x791a: 'Honeywell SP2'; 
0x2720: 'SPMini'; 
0x753e: 'SP3'; 
0x2728: 'SPMini2'; 
0x2733 or 0x273e: 'SPMini OEM';        
0x2736: 'SPMiniPlus'; 
0x2712: 'RM2'; 
0x2737: 'RM Mini'; 
0x273d: 'RM Pro Phicomm'; 
0x2783: 'RM2 Home Plus'; 
0x277c: 'RM2 Home Plus GDT'; 
0x272a: 'RM2 Pro Plus'; 
0x2787: 'RM2 Pro Plus2'; 
0x278b: 'RM2 Pro Plus BL'; 
0x278f: 'RM Mini Shate'; 
0x2714: 'A1'; 
0x4EB5: 'MP1'; 
>= 0x7530 and <= 0x7918: 'SPMini2 OEM';

在字节38(0x26)是command,对应的request IDs如下:
Hello       : [0x6]
Discover    : [0x1a]
Join        : [0x14]
Auth        : [0x65]
Command     : [0x6a]
而且相应的response IDs:
Hello       : [0x7]
Discover    : [0x1b]
Join        : [0x15]
Auth        : [0x3e90]
Command     : [0x3ee]
还有一些额外的信息域:
字节40(0x28)共两个字节。这个值用来将请求与相应相关联。
字节42(0x2a)为设备的MAC地址,以小端格式存放。
字节48(0x30)为device id
字节52(0x34)为checksum。这个checksum的计算与整个消息是一样的,只不过它是针对payload的计算。
然后,如果要求加密,则加密整个payload,并把它加在头部后面(在public high的情况下是从第57个字节开始)。
数据加密是aes-128 CBC算法,无padding。IV如下:
Initial key: [0x09, 0x76, 0x28, 0x34, 0x3f, 0xe9, 0x9e, 0x23, 0x76, 0x5c, 0x15, 0x13, 0xac, 0xcf, 0x8b, 0x02]
Initial vector: [0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58]
本文只是对原文章进行翻译,若有侵权请及时告知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章