Zigbee Install code的使用和CRC的计算

前言

在集中式网络安全模式中,信任中心(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

优快云博客仅作为本人工作学习之余的笔记使用,无任何商业目的,如果侵犯了你的隐私或权益,请随时联系作者,本人将及时删除相关内容

参考资料:
[1]: https://csa-iot.org/
[2]: https://www.silabs.com/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值