英飞凌 TC3XX单片机HSM内核开发系列(七):Secure Boot深度解析

HSM UCB配置

UCB_HSM_ORIG 和 UCB_HSM_COPY配置描述

HSMCOTP保护配置了专用HSM闪存扇区的HSM独占和一次性可编程(OTP)保护。它提供了通过两个配置集增量添加此类保护到闪存扇区的可能性:

  • 从UCB_HSMCOTP0_ORIG和UCB_HSMCOTP0_COPY派生的HSMCOTP0配置集。
  • 从UCB_HSMCOTP1_ORIG和UCB_HSMCOTP1_COPY派生的HSMCOTP1配置集。
  • HSMCOTP使用案例

    当HSMCOTP0和HSMCOTP1配置集都处于UNLOCKED(未锁定)状态时,所有主设备都可以配置HSMCOTP保护。如果HSMCOTP0配置集被确认(CONFIRMED),则只有HSM被允许编程HSMCOTP1配置集。如果HSMCOTP1也被确认,则完整的HSMCOTP配置集将受到OTP保护。

    HSM配置安装

    UCB_HSM_ORIG 确认状态 UCB_HSM_COPY 确认状态 保护安装情况
    UNREAD(未读取) 不关心 重置值为默认保护。
    UNLOCKED(未锁定) 不关心 从UCB_HSM_ORIG安装保护。
    CONFIRMED(已确认) 不关心 从UCB_HSM_ORIG安装保护。
    ERRORED(错误) UNLOCKED(未锁定) 从UCB_HSM_COPY安装保护。
    ERRORED(错误) CONFIRMED(已确认) 从UCB_HSM_COPY安装保护。
    ERRORED(错误) ERRORED(错误) 安装默认保护。SSW退出并出现错误。

    UCB_HSMCOTP0_ORIG 确认状态
    UCB_HSMCOTP0_ORIG的确认状态由DMU_HF_CONFIRM1.PROINHSMCOTP0O指示。

    UCB_HSMCOTP0_COPY 确认状态
    UCB_HSMCOTP0_COPY的确认状态由DMU_HF_CONFIRM1.PROINHSMCOTP0C指示。

    UCB_HSMCOTP1_ORIG 确认状态
    UCB_HSMCOTP1_ORIG的确认状态由DMU_HF_CONFIRM1.PROINHSMCOTP1O指示。

    UCB_HSMCOTP1_COPY 确认状态
    UCB_HSMCOTP1_COPY的确认状态由DMU_HF_CONFIRM1.PROINHSMCOTP1C指示。

    HSMCOTP0 确认状态
    如果UCB_HSMCOTP0_ORIG的确认状态是UNLOCKED或CONFIRMED,则HSMCOTP0的确认状态就是UCB_HSMCOTP0_ORIG的状态;否则,它是UCB_HSMCOTP0_COPY的状态。

    HSMCOTP1 确认状态
    如果UCB_HSMCOTP1_ORIG的确认状态是UNLOCKED或CONFIRMED,则HSMCOTP1的确认状态就是UCB_HSMCOTP1_ORIG的状态;否则,它是UCB_HSMCOTP1_COPY的状态。

    HSMCOTP保护配置安装

  • 初始保护:如果HSMCOTP0的确认状态是UNLOCKED或CONFIRMED,则将DMU_SP_PROCONHSMCFG、DMU_SP_PROCONHSMCBS、DMU_SP_PROCONHSMCX0、DMU_SP_PROCONHSMCX1、DMU_SP_PROCONHSMCOTP0和DMU_SP_PROCONHSMCOTP1寄存器的内容初始化为HSMCOTP0。
  • 后续保护:如果HSMCOTP1的确认状态是CONFIRMED,则将HSMCOTP1与初始值进行逻辑或(OR)操作。
  • 如果HSMCOTP0或HSMCOTP1的任一确认状态是ERRORED,则安装默认保护。
  • UCB_HSMCOTP0/1_ORIG 和 UCB_HSMCOTP0/1_COPY 擦除保护

    当至少一个HSMCOTP配置集的确认状态为CONFIRMED或ERRORED时,UCB_HSMCOTP0_ORIG、UCB_HSMCOTP0_COPY、UCB_HSMCOTP1_ORIG和UCB_HSMCOTP1_COPY受到擦除保护。

    UCB_HSMCOTP0_ORIG 和 UCB_HSMCOTP0_COPY 编程保护

    当满足以下任一条件时,所有主设备都不能对UCB_HSMCOTP0_ORIG和UCB_HSMCOTP0_COPY进行编程:

  • HSMCOTP0配置集的确认状态是CONFIRMED或ERRORED。
  • HSMCOTP1配置集的确认状态是ERRORED。
  • UCB_HSMCOTP1_ORIG 和 UCB_HSMCOTP1_COPY 编程保护

    除了HSM外,当满足以下任一条件时,所有主设备都不能对UCB_HSMCOTP1_ORIG和UCB_HSMCOTP1_COPY进行编程:

  • HSMCOTP0配置集的确认状态是CONFIRMED。
  • 当满足以下任一条件时,包括HSM在内的所有主设备都不能对UCB_HSMCOTP1_ORIG和UCB_HSMCOTP1_COPY进行编程:

  • HSMCOTP0配置集的确认状态是ERRORED。
  • HSMCOTP1配置集的确认状态是CONFIRMED或ERRORED。
  • UCB_HSMCOTP0/1_ORIG 和 UCB_HSMCOTP0/1_COPY 读取保护

    所有片上总线主设备都可以读取UCB_HSMCOTP0/1_ORIG和UCB_HSMCOTP0/1_COPY。

    UCB描述

    const Ifx_UCB_HSMCOTPX_t ucb_hsmcotp0_orig =
    {
        /**< \brief 0x000: 当用户拥有控制权时的DF1模式 */
        .PROCONUSR.B.MODE = SingleEnded,
    
        /**< \brief 0x004: HSM代码扇区的启动选择 */
        .PROCONHSMCBS.B.BOOTSEL0 = SectorHSM6XSearched,
        .PROCONHSMCBS.B.BOOTSEL1 = SectorHSM8XSearched,
        .PROCONHSMCBS.B.BOOTSEL2 = SectorHSM0XSearched,
        .PROCONHSMCBS.B.BOOTSEL3 = SectorHSM0XSearched,
    
        /**< \brief 0x008: HSM代码扇区的HSM独占保护配置 */
        .PROCONHSMCX0.U = 0,
    
        /**< \brief 0x00C: HSM代码扇区的HSM独占保护配置 */
        .PROCONHSMCX1.U = 0,
    
        /**< \brief 0x010: HSM PFLASH扇区x的HSM代码永远锁定 */
        .PROCONHSMCOTP0.U = 0,
    
        /**< \brief 0x014: HSM PFLASH扇区x的HSM代码永远锁定 */
        .PROCONHSMCOTP1.U = 0,
    
        /**< \brief 0x018: HSM保护配置 */
        .PROCONHSMCFG.B.HSMBOOTEN = HsmBootIsEnabled, // HSM启动使能
        .PROCONHSMCFG.B.SSWWAIT = SswWaitsForAcknowledgmentFromHsm, // 系统软件等待HSM确认
        .PROCONHSMCFG.B.HSMDX = HsmDataSectorsAreNotExclusiveToHsm, // HSM数据扇区不对HSM独占
        .PROCONHSMCFG.B.HSMRAMKEEP = SswClearsHsmRamAfterAllPowerOnResetsAndSystemResets, // 系统软件在所有上电复位和系统复位后清除HSM RAM
        .PROCONHSMCFG.B.HSMENPINS = HsmCanForcePins, // HSM可以强制控制引脚
        .PROCONHSMCFG.B.HSMENRES = HsmCannotTriggerResets, // HSM不能触发复位
        .PROCONHSMCFG.B.DESTDBG = DebugEntryIsNonDestructive, // 调试入口是非破坏性的
        .PROCONHSMCFG.B.BLKFLAN = FunctionsAllowedOnAllFlashRanges, // 允许在所有闪存范围内的功能
    
        .confirmation = UNLOCKED, // 确认状态为未锁定
    };
    

    在这个结构体初始化中:

  • .PROCONUSR.B.MODE 设置了DF1模式,这里使用 SingleEnded 表示单端模式。
  • .PROCONHSMCBS 结构体定义了HSM代码扇区的启动选择,这里 BOOTSEL0BOOTSEL3 被设置为搜索不同的扇区。
  • .PROCONHSMCX0.PROCONHSMCX1 结构体提供了HSM代码扇区的独占保护配置,这里都被清零,可能表示没有启用额外的保护。
  • .PROCONHSMCOTP0.PROCONHSMCOTP1 表示HSM PFLASH扇区的锁定配置,这里也被清零,可能表示初始状态未锁定。
  • .PROCONHSMCFG 结构体包含了HSM保护的多种配置选项,根据位字段的不同,设置了HSM的启动、系统软件的等待、数据扇区的独占性、RAM的保持、引脚的控制等。
  • .confirmation 成员设置为 UNLOCKED,表示这个配置是可以被编程或擦除的。
  • 寄存器描述

    PROCONUSR

    /**
     * @brief 结构体定义
     */
    typedef struct
    {
        unsigned int MODE      : 2;  /**< @brief DF1用户模式控制 */
        unsigned int res       : 30; /**< @brief 保留位 */
    } Ifx_PROCONUSR_Bits;
    

    在这个位域结构体中:

  • MODE 占用2位,用于控制DF1(可能指某种功能模式或调试模式)的用户模式。
  • res 保留30位,通常在当前版本中不使用,为将来可能的功能保留。这些保留位在编程时应设置为0。
  • /**
     * @brief DF1用户模式控制
     */
    typedef enum
    {
        SingleEnded = 0,        /**< @brief 单端模式 */
        ComplementSensing,      /**< @brief 互补传感模式 */
    } IfxDF1UserModeControl;
    

    在这个枚举类型中:

  • SingleEnded 表示单端模式,这是默认的第一个值,通常设置为0。
  • ComplementSensing 表示互补传感模式。
  • PROCONHSMCBS


    以下是给定结构体定义的中文注释:

    /**
     * @brief 结构体定义
     */
    typedef struct
    {
        unsigned int BOOTSEL0  : 6;  /**< @brief 启动扇区选择 */
        unsigned int res0      : 2;  /**< @brief 保留位 */
        unsigned int BOOTSEL1  : 6;  /**< @brief 启动扇区选择 */
        unsigned int rese1     : 2;  /**< @brief 保留位 */
        unsigned int BOOTSEL2  : 6;  /**< @brief 启动扇区选择 */
        unsigned int res2      : 2;  /**< @brief 保留位 */
        unsigned int BOOTSEL3  : 6;  /**< @brief 启动扇区选择 */
        unsigned int res3      : 2;  /**< @brief 保留位 */
    } Ifx_PROCONHSMCBS_Bits;
    

    在这个位域结构体中:

  • BOOTSEL0BOOTSEL3 每个成员占用6位,用于选择不同的启动扇区。
  • res0res3 每个成员占用2位,是保留位,通常在当前版本中不使用,为将来可能的功能保留。这些保留位在编程时应设置为0。
    以下是给定枚举类型的中文注释:
  • /**
     * @brief 枚举定义:HSM启动扇区选择
     */
    typedef enum
    {
        SectorHSM0XSearched = 0,  /**< @brief 搜索HSM0X扇区 */
        SectorHSM1XSearched,      /**< @brief 搜索HSM1X扇区 */
        // ......
        SectorHSM37XSearched,     /**< @brief 搜索HSM37X扇区 */
        SectorHSM38XSearched,     /**< @brief 搜索HSM38X扇区 */
        SectorHSM39XSearched,     /**< @brief 搜索HSM39X扇区 */
    } IfxHsmBootSectorSelection;
    

    在这个枚举类型中,每个成员代表一个HSM(高安全模块)启动扇区,从SectorHSM0XSearchedSectorHSM39XSearched。这些枚举值用于标识在系统启动过程中应该搜索的特定HSM扇区。枚举值从0开始,每个值递增,表示它们可以被直接用作数组索引或位字段中的偏移量。

    对应的地址与索引偏移量的公式为:

    HSM启动地址 = 0x80000000 + HSM扇区索引 * 0x4000

    PROCONHSMCX0
    PROCONHSMCX1

    /**
     * @brief HSM接口保护配置的结构体定义
     */
    typedef struct
    {
        unsigned int HSM0X  : 1;  /**< @brief PFLASH扇区x的HSM代码独占 */
        unsigned int HSM1X  : 1;  /**< @brief PFLASH扇区x的HSM代码独占 */
        // ... ...
        unsigned int HSM31X : 1;  /**< @brief PFLASH扇区x的HSM代码独占 */
    } Ifx_PROCONHSMCX0_Bits;
    

    在这个位域结构体中,每一位代表一个PFLASH扇区是否被HSM代码独占。如果某个位被设置为1,则表示对应的PFLASH扇区仅可由HSM代码访问,从而提供了一种保护机制以确保关键代码的安全。

    PROCONHSMCOTP0
    PROCONHSMCOTP1

    /**
     * @brief HSM接口保护配置的结构体定义
     */
    typedef struct
    {
        unsigned int HSM0ROM  : 1;  /**< @brief PFLASH扇区x的HSM代码永远锁定 */
        unsigned int HSM1ROM  : 1;  /**< @brief PFLASH扇区x的HSM代码永远锁定 */
        // ...  ...
        unsigned int HSM31ROM : 1;  /**< @brief PFLASH扇区x的HSM代码永远锁定 */
    } Ifx_PROCONHSMCOTP0_Bits;
    

    在这个位域结构体中,每一位代表一个PFLASH扇区是否被HSM代码永远锁定。如果某个位被设置为1,则表示对应的PFLASH扇区中的HSM代码是只读的,不能被擦除或修改,从而提供了一种保护机制以确保关键代码的安全性。

    PROCONHSMCFG

    /**
     * @brief HSM配置的结构体定义
     */
    typedef struct
    {
        unsigned int HSMBOOTEN  : 1;  /**< @brief HSM启动使能 */
        unsigned int SSWWAIT    : 1;  /**< @brief 系统软件等待 */
        unsigned int HSMDX      : 1;  /**< @brief HSM数据扇区独占 */
        unsigned int res0       : 1;  /**< @brief 保留位,为UCB保留 */
        unsigned int HSMRAMKEEP : 2;  /**< @brief HSM RAM清除方式 */
        unsigned int res1       : 1;  /**< @brief 保留位,为UCB保留 */
        unsigned int HSMENPINS  : 2;  /**< @brief 允许HSM强制控制引脚HSM1/2 */
        unsigned int HSMENRES   : 2;  /**< @brief 允许HSM触发复位 */
        unsigned int DESTDBG    : 2;  /**< @brief 破坏性调试入口 */
        unsigned int BLKFLAN    : 2;  /**< @brief 阻止闪存分析 */
        unsigned int res2       : 25; /**< @brief 保留位 */
    } Ifx_PROCONHSMCFG_Bits;
    

    在这个位域结构体中,每个成员代表HSM配置的不同方面:

  • HSMBOOTEN 表示是否启用HSM启动。
  • SSWWAIT 表示系统软件是否等待某个事件。
  • HSMDX 表示HSM数据扇区是否设置为独占。
  • res0res1 是为UCB(用户配置总线)保留的位。
  • HSMRAMKEEP 表示HSM RAM在不同复位后的清除行为。
  • HSMENPINS 表示是否允许HSM强制控制特定的引脚。
  • HSMENRES 表示是否允许HSM触发系统复位。
  • DESTDBG 表示调试入口是否具有破坏性。
  • BLKFLAN 表示是否阻止对闪存的分析。
  • res2 是一个较宽的保留位字段,通常在编程时应设置为0。
  • 以下是给定枚举类型的中文注释:

    /**
     * @brief HSM启动使能
     */
    typedef enum
    {
        HsmBootIsNotEnabled = 0,       /**< @brief HSM启动未使能 */
        HsmBootIsEnabled,              /**< @brief HSM启动已使能 */
    } IfxHsmBootEn;
    
    /**
     * @brief 定义系统软件(SSW)是否等待HSM释放CPU0跳转到用户代码
     */
    typedef enum
    {
        SswDoesNotWaitForHsm = 0,          /**< @brief SSW不等待HSM */
        SswWaitsForAcknowledgmentFromHsm,  /**< @brief SSW等待HSM确认 */
    } IfxSssWait;
    
    /**
     * @brief HSM数据扇区独占
     */
    typedef enum
    {
        HsmDataSectorsAreNotExclusiveToHsm = 0,     /**< @brief HSM数据扇区不独占 */
        HsmDataSectorsAreExclusiveToHsm,            /**< @brief HSM数据扇区独占 */
    } IfxHsmDX;
    
    /**
     * @brief HSM RAM清除
     */
    typedef enum
    {
        SswClearsHsmRamAfterAllPowerOnResetsAndSystemResets = 0,  /**< @brief 所有上电复位和系统复位后SSW清除HSM RAM */
        SswClearsHsmRamAfterAllPowerOnResetsNotOnSystemResets,    /**< @brief 所有上电复位后SSW清除HSM RAM,系统复位不清除 */
        SswClearsHsmRamOnlyAfterColdPowerOnResets = 3,            /**< @brief 仅在冷上电复位后SSW清除HSM RAM */
    } IfxHsmRamKeep;
    
    /**
     * @brief 允许HSM强制控制引脚HSM1/2
     */
    typedef enum
    {
        HsmCannotForcePins = 0,  /**< @brief HSM不能强制控制引脚 */
        HsmCanForcePins = 3,     /**< @brief HSM可以强制控制引脚 */
    } IfxHsmEnPins;
    
    /**
     * @brief 允许HSM触发复位
     */
    typedef enum
    {
        HsmCannotTriggerResets = 0,  /**< @brief HSM不能触发复位 */
        HsmCanTriggerResets = 3,     /**< @brief HSM可以触发复位 */
    } IfxHsmEnRes;
    
    /**
     * @brief 破坏性调试入口
     */
    typedef enum
    {
        DebugEntryIsNonDestructive = 0,  /**< @brief 调试入口是非破坏性的 */
        DebugEntryIsDestructive = 3,     /**< @brief 调试入口是破坏性的 */
    } IfxDestDbg;
    
    /**
     * @brief 阻止闪存分析
     */
    typedef enum
    {
        FunctionsAllowedOnAllFlashRanges = 0,       /**< @brief 允许在所有闪存范围内的功能 */
        FunctionsBlockedOnHsmExclusiveFlashRanges,  /**< @brief 在HSM独占的闪存范围内阻止功能 */
    } IfxBlkFlan;
    

    每个枚举类型提供了不同的配置选项,用于控制HSM(高安全模块)的各种特性,包括启动使能、系统软件的等待行为、数据扇区的独占性、RAM的清除策略、引脚的控制、复位的触发、调试的破坏性以及闪存分析的阻止。

    作者:美好生活丶

    物联沃分享整理
    物联沃-IOTWORD物联网 » 英飞凌 TC3XX单片机HSM内核开发系列(七):Secure Boot深度解析

    发表回复