接上篇:
【先楫HPM5361EVK开发板试用体验】1上手HPM5361 - 先楫半导体HPMicro
欢迎来到密钥管理器 KEYM 的奇妙世界!就像一个超级英雄,KEYM 有着许多超能力和特技,让我们一起来看看它的主要特性吧!
首先,KEYM 有着强大的"载入"技能,它可以从其他模块中加载密钥,就像是电影中的英雄从他的超级英雄伙伴那里获得能量一样。这些密钥就像是打开加密和解密引擎的钥匙,让我们的系统可以安全地运行。
其次,KEYM 还有一项"加扰"技能。这个技能可以保护输入的密钥不被其他软件发现,就像是给密钥穿上隐身斗篷一样。这样,我们的密钥就不会被恶意软件偷走,大大提高了系统的安全性。
然后,KEYM 会将加扰后的密钥输送给加密和解密引擎,让它们可以正常工作。这就像是将超级英雄的能量输送给他的超级英雄伙伴一样,让他们可以一起完成任务。
此外,KEYM 还支持软件密钥 SMK。这个密钥就像是超级英雄的特殊武器,可以让 KEYM 在软件世界中发挥更大的作用。
同时,KEYM 还有生成多个 SK(session key)的技能。这些 SK 就如同超级英雄的临时装备,可以根据不同的任务需求进行更换。
最后,KEYM 还能将多个密钥合成一个密钥。这就像是将不同的超级英雄的能量合并在一起,形成一个更强大的能量源。
密钥管理器 KEYM 就像是一个超级英雄一样,拥有各种强大的特性和技能,为我们的系统提供着安全保障。在它的帮助下,我们的系统可以安全、稳定地运行,让我们的生活更加便捷和安全。
SMK 密钥
首先让我们来看看这个256位的大帅哥 SMK。这位 SMK 可以被软件写入 SFK0 到 SFK7 这些豪华的寄存器里。不仅如此,SMK 还支持 SMKRNG 端口直接载入,这可是 VIP 通道哦!
- 当
RNG[RNG_XOR] = 0’b0
时,SMK 就直接填入 RNG 生成的随机数,就像一个吃货直接扑向美食一样。
- 当
RNG[RNG_XOR] = 0’b1
时,SMK 会更新为原值与 RNG 生成的随机数按位异或,这可是个高级混合饮料!
而且,如果你把 KEYM_RNG[BLOCK_RNG_XOR]
这个位置设为1,那 KEYM_RNG[RNG_XOR]
位的值就被锁定了,不能再更改,这可是个保险锁哦!
密钥管理器还支持对存放 SMK 密钥的寄存器设置读保护。把 READ_CONTROL [BLOCK_SMK_READ]
这个位置设为1,软件就不能再读取 SFK0 到 SFK7 了,这可是个防盗门!
用户使用 SMK 可以选择原始数据或者加扰。不同安全状态下,密钥管理器还支持单独配置密钥是否加扰,使用不同的加扰算法。就像给饮料加冰和不加冰的区别一样。
SEC_KEY_SEL[SMK_SEL]
位置1表示当系统安全状态为 SEC 时,使用加扰后 SMK;否则使用 SMK 的原始数据。
NSC_KEY_SEL[SMK_SEL]
位置1表示当系统安全状态为 NSC 时,使用加扰后 SMK;否则使用 SMK 的原始数据。
MK 密钥
接下来我们看看 MK 这位大佬。MK 可以从 FMK、SMK 中选择一位跳舞伙伴,也可以由它们中的多个或者全部合成,来个大杂烩!
通过密钥合成,可以把根密钥分散管理,降低风险。不同安全状态下,密钥管理器也支持单独配置 MK 合成。具体配置方法有点像调鸡尾酒:
SEC_KEY_SEL
寄存器的 KEY_SEL[0]
置1表示当系统安全状态为 SEC 时,FMK 参与密钥合成;否则输出密钥与 FMK 无关。
SEC_KEY_SEL
寄存器的 KEY_SEL[2]
置1表示当系统安全状态为 SEC 时,SMK 参与密钥合成;否则输出密钥与 SMK 无关。
NSC 状态下的配置也类似。如果你把 SEC_KEY_SEL
寄存器的 KEY_SEL[0]
置为1,而 KEY_SEL[2]
置为0,那么在安全状态为 SEC 时,密钥管理器就会把 FMK 当作 MK 输出。但如果两个合成因子都为0,或者选择的因子有任意一个输入无效值,那就会输出全零密钥。这可是个“没有秘密”的密钥哦!
好啦,这就是 SMK 和 MK 的精彩世界!记得保持警惕,别让密钥落到坏人手里哦!接下来我们再聊一聊“SK 密钥”和“KEYM 寄存器列表”这两个看似高大上,实则非常有趣的话题。
SK 密钥
首先,让我们来了解一下 SK 密钥,这位神秘的小伙伴又称为 session key。密钥管理器能够支持输出 SK0、SK1、SK2、SK3 到系统上的加解密引擎,就像给引擎送上一份精美的礼物一样。
但是呢,为了实现系统在不同安全状态下的密钥隔离,密钥管理器会在 SEC 和 NSC 这两个不同状态下,生成不同的 SK。这就像是为 SEC 和 NSC 这两个好朋友分别准备不同的生日蛋糕一样。
- 当
SEC_KEY_SEL[SK_VAL]
这个位置设为1时,表示当系统安全状态为 SEC 时,SK 生成有效;否则 SKx 的输出就是全0。就像一个开关,打开时有蛋糕,关闭时就只有空盘子了。
- 同样地,当
NSC_KEY_SEL[SK_VAL]
这个位置设为1时,表示当系统安全状态为 NSC 时,SK 生成有效;否则也是全0输出。
而且哦,密钥管理器的 SK 密钥生成是通过密钥生成模块实现的。这个模块的输入是 SMK,每一颗芯片都有不同的密钥产生逻辑,不同的 SKx 之间,密钥生成模块逻辑也不相同。就像每一颗芯片都是一个独特的厨师,用相同的食材(SMK)能做出不同的美味佳肴(SK)。
KEYM 寄存器列表
接下来,我们来一起浏览一下 KEYM 的寄存器列表。这个列表就像是一个藏满宝藏的地图,上面标注了各种各样的神秘地址和神秘宝藏。一起来探险吧!
在这个列表中,我们可以看到很多有趣的寄存器,比如 SOFTMKEY[SFK0] 到 SOFTMKEY[SFK7],这些寄存器里藏着软密钥,就像是一串神秘的魔法咒语。还有 SOFTPKEY[SPK0] 到 SOFTPKEY[SPK7],这些寄存器里藏着私钥,就像是一把能打开宝藏的神秘钥匙。
另外,还有 SEC_KEY_CTL 和 NSC_KEY_CTL 这两个寄存器,分别负责安全密钥和非安全密钥的产生。它们就像是一个掌控着加密解密大权的魔法师,可以根据需要创造出各种各样的密钥来。
最后还有一个 RNG 随机数发生器接口和一个 READ_CONTROL 密钥读取控制寄存器。它们就像是一个随机赠送礼物的精灵和一个看守宝藏的守卫,让加密解密的冒险更加刺激和有趣。
寄存器实战描述
首先,让我们来认识一下 KEYM 的两个重要寄存器:SOFTMKEY 和 SOFTPKEY。想象一下,SOFTMKEY 就像是一把软糖钥匙,可以随时改变形状;而 SOFTPKEY 就像是一把硬糖钥匙,一旦成型就无法改变。
SOFTMKEY (0x0 + 0x4 * n)
SOFTMKEY 寄存器排列得就像是一串串晶莹剔透的冰糖葫芦。每个寄存器的名字叫作 SOFTMKEY [31:0],从最低位到最高位,每个位都有它的特殊功能。
其中,最右边的位是 KEY,这是我们今天要重点介绍的。这把“软密钥”有四种加扰版本,就像四种不同的口味。加扰的方式很神奇,同一颗芯片上的加扰版本可以重复,但是不同芯片上的加扰版本是不可重复的。这就好像你在吃糖葫芦,同一颗糖葫芦可能有很多相同的糖果,但是不同糖葫芦的糖果是不可能完全一样的。
另外,这组寄存器必须按照顺序从 0-7 写入,否则输出就会是全 0。所以,写入时要小心哦,不要写错了顺序!
SOFTPKEY (0x20 + 0x4 * n)
接下来我们来看 SOFTPKEY 寄存器。这个寄存器的名字叫作 SOFTPKEY [31:0],它就像是 SOFTMKEY 的升级版,比 SOFTMKEY 更加强大和神秘。
位域中,最右边的位也是 KEY,这个 KEY 是由熔丝私钥、软件密钥、SRK 以及系统安全状态派生出来的。这个密钥很珍贵,只能读取一次,再次读取就会得到全 0。这就像是你去看一部只有一次机会的电影,看完就没了,想再看就只能等下一次了。
SEC_KEY_CTL (0x40)
最后我们来看看 SEC_KEY_CTL 寄存器。这个寄存器的名字叫作 SEC_KEY_CTL [31:0],它是一个控制寄存器,负责管理其他两个寄存器的行为。
其中,LOCK_SEC_CTL 位是禁止更改密钥设置的位。如果这个位被设置,那么其他位就不能被更改了,就像是锁住了一样。所以,如果你不想别人乱设置你的密钥,就要记得把这个位锁住哦!
另外,SK_VAL 位是会话密钥有效位。如果这个位是 1,那么就表示会话密钥有效;如果是 0,那么就表示会话密钥未设置或不可用。这个位就像是确认键,只有按下确认键,密钥才会生效。
还有 SMK_SEL 位是软密钥选择位。如果这个位是 1,那么就会使用加扰版本的软密钥;如果是 0,那么就会使用原始密钥。这个位就像是选择题的选择键,你可以选择使用原始版本或者加扰版本。
ZMK_SEL 位是电池域密钥选择位(如果有电池域的话)。如果这个位是 1,那么就会使用原始密钥;如果是 0,那么就会使用加扰版本。这个位就像是电池开关,你可以选择开启或者关闭电池域。
FMK_SEL 位是熔丝对称密钥选择位。如果这个位是 1,那么就会使用加扰版本的对称密钥;如果是 0,那么就会使用原始密钥。这个位就像是调节音量的旋钮,你可以选择高音或者低音。
最后是 KEY_SEL 位安全状态对称密钥合成选择位。这个位就像是组合键,你可以选择不同的密钥进行合成。比如你可以选择熔丝密钥、电池密钥和软密钥进行合成。
好的,我们继续来聊一聊 KEYM 寄存器的那些事儿,这次我们将用轻松的方式讲解 NSC_KEY_CTL、RNG 和 READ_CONTROL 这几个位域。
NSC_KEY_CTL(0x44)
这个寄存器就像一个“密钥交通警察”,它掌控着密钥的选择与交通。一起来认识一下这个交通警察的几位得力助手吧!
-
LOCK_NSC_CTL:这位助手非常严格,一旦你设置了他,他就不允许你更改任何密钥设置,就像一个严格的交通警察,保证了密钥的安全性。
-
SK_VAL:他就像是一个密钥的验票员,如果会话密钥有效,他就会放行,否则他就会拦截,保证只有持有有效票据的人才能通过。
-
SMK_SEL、ZMK_SEL、FMK_SEL:他们就像是密钥的导游,他们决定你要使用哪个版本的密钥。你可以选择原始版本,也可以选择加扰版本。
-
KEY_SEL:他就像是一个密钥的合成师,他可以根据你的需要,将不同的密钥合成为你需要的密钥。
RNG (0x48)
这个寄存器就像一个随机数生成器,他可以为你的密钥添加一些随机性,让你的密钥更加安全。
- BLOCK_RNG_XOR:他就像是一个随机数生成器的守门员,一旦你设置了他,他就不允许你修改 RNG_XOR 位,就像一个守门员,保证了随机数生成器的安全性。
- RNG_XOR:他就像是一个随机数的魔法师,他可以选择如何接收随机数,可以选择替换软密钥,也可以选择和原有密钥异或。
READ_CONTROL (0x4C)
这个寄存器就像是一个密钥的读取控制器,他可以控制你是否可以读取私钥和软密钥。
- BLOCK_PK_READ:他就像是一个私钥的保镖,一旦你设置了他,他就不允许你读取私钥,保证了私钥的安全性。
- BLOCK_SMK_READ:他就像是一个软密钥的保镖,一旦你设置了他,他就不允许你读取软密钥,保证了软密钥的安全性。
总的来说,KEYM 寄存器的这些位域就像是一群辛勤工作的员工,他们各司其职,共同维护着你的密钥的安全。希望这次的经验能让大家对 KEYM 寄存器有更深入的了解!你学废了吗