Zigbee Install code的使用和CRC的计算
- 前言
- 什么是Install codes?
- Zigbee install codes的格式
- CRC算法信息:
- python演示:
- Install Code的使用:
- 烧录Install codes到Silicon labs EFR32设备中去
- 安装代码文件格式
- 烧录Install codes:
- 核查烧录的Install codes:
- 读取预烧录的EUI-64:
前言
在集中式网络安全模式中,信任中心(Trust Center)可以要求每个新设备使用唯一的Install Code来加入集中式安全网络。Install Code 必须与以带外方式与预先输入信任中心(Trust Center)的秘钥匹配。
例如,Install Code 可以用数字或二维码的形式打印在加入设备的包装中;用户或安装者可以将密码键入或扫描到连接信任中心(Trust Center) 的智能手机或平板电脑中。所有zigbee 设备都必须包含唯一的Install Code。
什么是Install codes?
Zigbee Install codes,有时也称为“Installtion code”,Install codes是在设备生产制造时烧录到设备上的随机值,用于加密从Zigbee网络的信任中心(Trust Center)到待入网设备的初始网络密钥传输。 Zigbee Install codes提供一种让设备以合理安全的方式加入Zigbee网络的方法。Zigbee 3.0规定,所有能够加入网络的Zigbee设备必须支持在入网时使用Install codes,这是 Zigbee 3.0 合规性的要求。
Install codes通常印在设备的外壳或包装上,可以是十六进制字符串,也可以是条形码或二维码等编码方式。在入网过程中,Install codes通常和设备的64位IEEE MAC地址(EUI64)一起并通过带外机制提供给信任中心(Trust Center)或其关联的网络/云界面。
Install codes由16位CRC保护的随机128位数字。待入网设备和信任中心(Trust Center)根据其共同的Install Code使用Matyas-Meyer-Oseas(MMO)哈希算法生成唯一的128位Trust Center Link Key。
Zigbee install codes的格式
Zigbee 3.0网络要求Install Code 由一个128位的数字和一个16位的CRC(使用CCITT CRC标准多项式:𝑥16+ 𝑥12+𝑥5+1)组成。Zigbee 3.0特别要求使用16字节的十六进制安装代码,并附加2字节的CRC。 因此,从用户的角度来看,Install Code的长度为 18字节(在 ZSE 设备中可能有 8、10 或 14 字节的变体)。打印或显示install code时,Install code表示为多组4个十六进制数字。CRC16应以小端字节顺序交付给用户。 对用户而言,CRC是install code的一部分,用户不需要知道CRC的存,也不需要知道CRC为什么存在。
提示:Zigbee 3.0特别要求使用16字节的Install codes,Zigbee smart energy允许使用6,8,12,16字节的Install codes。
CRC算法信息:
Zigbee install code的CRC用于在install code通过带外机制传输到应用程序时验证install code的完整性。 CRC 被设计为一种验证install code是否有效且在传输过程中未被错误更改的方法。Zigbee install code的CRC计算是基于CRC 16-CCITT算法并使用以下参数计算:
Length: 16
Polynomial: 𝑥16+ 𝑥12+𝑥5+1 (0x1021)
Initialization method: Direct
Initialization value: 0xFFFF
Final XOR value: 0xFFFF
Reflected In: True
Reflected Out: True
python演示:
Install code:"83FE D340 7A93 9723 A5C6 39B2 6916 D505 C3B5"
使用数值0x83, 0xFE, 0xD3, 0x40, 0x7A, 0x93, 0x97, 0x23, 0xA5, 0xC6, 0x39, 1780 0xB2, 0x69, 0x16, 0xD5, 0x05来计算CRC16的值,CRC16的结果为0xB5C3(Install code和CRC16使用小端模式显示).
#!/usr/bin/python3
def print_bytes_hex(data):
lin = ['%02X' % i for i in data]
print(" ".join(lin))
def caculate_install_code_CRC(install_code):
#CRC-16-CITT poly, the CRC sheme used by ymodem protocol
poly = 0x8408
crc16 = 0xFFFF
data = 0xFF
if(len(install_code)) != 32:
crc16 = ~crc16
print()
return crc16
install_code_byte = bytearray.fromhex(install_code)
install_code_list = list(install_code_byte)
print_bytes_hex(install_code_list)
index = 0
for x in install_code_list:
#print("%02x" % x)
data = 0xFF & install_code_list[index]
#print(hex(data))
index = index + 1
#print("orignal data = %x" %data)
for i in range(8):
#print("data value = %x caculate crc16 = %x" %(data,crc16))
temp = (crc16 & 0x0001) ^ (data & 0x0001)
if temp == 0:
crc16 >>=1
else:
crc16 = (crc16 >> 1) ^ poly
#print(hex(crc16))
crc16 = crc16 & 0xFFFF
#print("crc resualt = %x" %crc16)
data >>= 1
crc16 = ~crc16
crc16 = crc16 & 0xFFFF
return crc16
主函数
if __name__ == '__main__':
install_code = '83FED3407A939723A5C639B26916D505'
installcodecrc = caculate_install_code_CRC(install_code)
print("crc resualt = %X" %installcodecrc)
Install Code的使用:
如图所示,在工厂生产过程中,会为每个节点创建一个随机Install codes。 Install codes以制造商特定的方式(标签等)提供,并在安装(设备入网)期间引用。 Install codes应该具有与密钥空间相同的随机性属性。Install codes是随机产生的,但可能并不是唯一的。 知道一组Install codes不应该产生任何另一个Install codes的知识,每个Install codes应该是等概率的。
如图所示,在安装过程(设备入网)中,Trust Center link key是从Install codes产生的,并通过带外通信通道发送到信任中心。 信任中心使用此密钥作为Trust Center link key,随后用于配置关联节点的网络密钥(Network key)。
烧录Install codes到Silicon labs EFR32设备中去
安装代码文件格式
烧录Install codes到Silicon labs EFR32设备中去,需要先创建一个包含Install codes(不包含CRC)的简单文本文件。例如:文件名为 install-code-file.txt。 该文件通过Simplicity Commander烧录到EFR32中。install-code-file.txt文件内容如下:
Install Code: 83FED3407A939723A5C639B26916D505
烧录Install codes:
commander flash --tokengroup znet --tokenfile install-code-file.txt
核查烧录的Install codes:
commander tokendump --tokengroup znet
读取预烧录的EUI-64:
commander tokendump --tokengroup znet --token MFG_EMBER_EUI_64
打包python脚本
pip install pyinstaller
pyinstaller -F -c crc_caculatee.py
CSDN博客仅作为本人工作学习之余的笔记使用,无任何商业目的,如果侵犯了你的隐私或权益,请随时联系作者,本人将及时删除相关内容
参考资料:
[1]: https://csa-iot.org/
[2]: https://www.silabs.com/