Python seccfg 类解析与创建:用于安全配置的解析和生成
这段 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 函数将数据解包成多个整数,分别对应 magic、seccfg_ver、seccfg_size、lock_state、critical_lock_state、sboot_runtime 和 endflag。然后,提取数据中的哈希值并存储到 hash 属性中。最后,检查 magic 和 endflag 是否符合预期,如果符合则返回 True,否则输出错误信息并返回 False。
create 方法
create 方法用于创建新的 seccfg 数据。根据传入的参数 sc_org、hwtype 和 lockflag 设置不同的属性值。sc_org 是可选参数,用于复制已有 seccfg 的属性值。hwtype 参数用于指定加密方式,sw 表示软加密,其他表示硬加密。lockflag 参数用于指定锁定状态,可以设置为 'unlock' 或 'lock'。
创建 seccfg 数据的过程包括以下步骤:
- 使用
pack函数将属性值打包成二进制数据。 - 计算二进制数据的 SHA256 哈希值。
- 根据
hwtype选择相应的加密函数对哈希值进行加密。 - 将打包的二进制数据和加密后的哈希值拼接成完整的 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 数据的解析和创建功能,并通过加密和哈希校验确保数据安全和完整性。该代码可以用于各种需要安全配置信息的场景,例如硬件设备的初始化、软件升级等。
原文地址: https://www.cveoy.top/t/topic/XNJ 著作权归作者所有。请勿转载和采集!