这段 Python 代码实现了一个名为 seccfg 的类,用于解析和创建安全配置数据 (Secure Configuration),简称 seccfg。

类属性和构造函数

seccfg 类的构造函数中,初始化了以下属性:

  • hwc:硬件配置
  • magic:魔术数,值为 0x4D4D4D4D,用于识别 seccfg 数据结构
  • seccfg_ver:seccfg 版本号
  • seccfg_size:seccfg 数据大小
  • lock_state:锁定状态
  • critical_lock_state:关键锁定状态
  • sboot_runtime:Sboot 运行时状态
  • endflag:结束标志,值为 0x45454545,用于标记 seccfg 数据结尾
  • hash:哈希值,用于校验数据完整性

parse 方法

parse 方法用于解析传入的 seccfg 数据。首先,使用 unpack 函数将数据解包成多个整数,分别对应 magicseccfg_verseccfg_sizelock_statecritical_lock_statesboot_runtimeendflag。然后,提取数据中的哈希值并存储到 hash 属性中。最后,检查 magicendflag 是否符合预期,如果符合则返回 True,否则输出错误信息并返回 False

create 方法

create 方法用于创建新的 seccfg 数据。根据传入的参数 sc_orghwtypelockflag 设置不同的属性值。sc_org 是可选参数,用于复制已有 seccfg 的属性值。hwtype 参数用于指定加密方式,sw 表示软加密,其他表示硬加密。lockflag 参数用于指定锁定状态,可以设置为 'unlock' 或 'lock'。

创建 seccfg 数据的过程包括以下步骤:

  1. 使用 pack 函数将属性值打包成二进制数据。
  2. 计算二进制数据的 SHA256 哈希值。
  3. 根据 hwtype 选择相应的加密函数对哈希值进行加密。
  4. 将打包的二进制数据和加密后的哈希值拼接成完整的 seccfg 数据。

代码示例

from struct import unpack, pack
import hashlib


class seccfg:
    def __init__(self, hwc):
        self.hwc = hwc
        self.magic = 0x4D4D4D4D
        self.seccfg_ver = None
        self.seccfg_size = None
        self.lock_state = None
        self.critical_lock_state = None
        self.sboot_runtime = None
        self.endflag = 0x45454545
        self.hash = b""

    def parse(self, data):
        seccfg_data = unpack('<IIIIIII', data[:7 * 4])
        self.magic, self.seccfg_ver, self.seccfg_size, self.lock_state, self.critical_lock_state, \
        self.sboot_runtime, self.endflag = seccfg_data
        self.hash = data[7 * 4:(7 * 4) + 32]
        if self.magic != 0x4D4D4D4D or self.endflag != 0x45454545:
            self.error('Unknown seccfg structure !')
            return False
        return True

        '''
        LKS_DEFAULT = 0x01
        LKS_MP_DEFAULT = 0x02
        LKS_UNLOCK = 0x03
        LKS_LOCK = 0x04
        LKS_VERIFIED = 0x05
        LKS_CUSTOM = 0x06
        LKCS_UNLOCK = 0x01
        LKCS_LOCK = 0x02
        SBOOT_RUNTIME_OFF = 0
        SBOOT_RUNTIME_ON  = 1
        '''

    def create(self, sc_org, hwtype: str, lockflag: str = 'unlock', V3=False):
        if sc_org is None:
            if lockflag == 'unlock':
                self.lock_state = 3
                self.critical_lock_state = 1
                self.seccfg_ver = 4
                self.seccfg_size = 0x3C
                self.sboot_runtime = 0
            elif lockflag == 'lock':
                self.lock_state = 1
                self.critical_lock_state = 0
                self.seccfg_ver = 4
                self.seccfg_size = 0x3C
                self.sboot_runtime = 0
        else:
            self.lock_state = sc_org.lock_state
            self.critical_lock_state = sc_org.critical_lock_state
            self.seccfg_size = sc_org.seccfg_size
            self.sboot_runtime = sc_org.sboot_runtime
            self.seccfg_ver = sc_org.seccfg_ver
        seccfg_data = pack('<IIIIIII', self.magic, self.seccfg_ver, self.seccfg_size, self.lock_state,
                           self.critical_lock_state, self.sboot_runtime, 0x45454545)
        dec_hash = hashlib.sha256(seccfg_data).digest()
        if hwtype == 'sw':
            enc_hash = self.hwc.sej.sej_sec_cfg_sw(dec_hash, True)
        else:
            if not V3:
                enc_hash = self.hwc.sej.sej_sec_cfg_hw(dec_hash, True)
            else:
                enc_hash = self.hwc.sej.sej_sec_cfg_hw_V3(dec_hash, True)
        self.hash = enc_hash
        data = seccfg_data + enc_hash
        data += b'�' * (0x200 - len(data))
        return bytearray(data)

总结

总体来说,这段代码实现了 seccfg 数据的解析和创建功能,并通过加密和哈希校验确保数据安全和完整性。该代码可以用于各种需要安全配置信息的场景,例如硬件设备的初始化、软件升级等。

Python seccfg 类解析与创建:用于安全配置的解析和生成

原文地址: https://www.cveoy.top/t/topic/XNJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录