SPI ENC 配置
5 Nov 2024
Read time: 3 minute(s)
内核配置
使能 SPI_ENC 相关的内核驱动,可在通过下列命令进行配置(在 SDK 顶层目录执行):
make linux-menuconfig
在内核的配置界面中,进行下列的选择:
Cryptographic API --->
[*] Hardware crypto devices --->
[*] Support for artinchip cryptographic accelerator
<*> Artinchip's SPI Bus on-the-fly encryption driver
进行如上的配置之后,内核 SPI_ENC 驱动使能,SPI NOR / SPI NAND 驱动在数据访问时, 自动进行数据加解密。
DTS 配置
芯片级的 DTS:
spienc: spienc@18100000 {
compatible = "artinchip,aic-spienc-v1.0";
reg = <0x18100000 0x1000>;
interrupts-extended = <&plic0 41 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cmu CLK_SPIENC>;
resets = <&rst RESET_SPIENC>;
aic,spienc-tweak = <0>;
};
其中板级的配置 board.dts 中需要使能该模块:
&spienc {
aic,spienc-tweak = <0>;
u-boot,dm-pre-reloc;
status = "okay";
};
DTS 中的 aic,spienc-tweak
可以影响 COUNTER 的生成,进而改变加密的结果。
如果需要让在不同的产品对相同的数据有不同的加密结果,则可以在 DTS 中调整该值。
并且需要配置具体的 SPI NAND / SPI NOR 设备是否使能加密:
-
aic,encrypt
-
aic,spi-id
例如: board.dts
&spi0 {
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins_a>;
status = "okay";
spi-flash@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "spi-nand";
spi-max-frequency = <24000000>;
spi-tx-bus-width = <1>;
spi-rx-bus-width = <1>;
reg = <0>;
aic,encrypt; // 标记该存储设备使能 SPI_ENC
aic,spi-id = <0>; // 设置当前存储设备所挂载的 SPI 控制器 ID
status = "okay";
};
};
&spi1 {
pinctrl-names = "default";
pinctrl-0 = <&spi1_pins_a>;
status = "okay";
spi-flash@0 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "jedec,spi-nor";
spi-max-frequency = <24000000>;
spi-tx-bus-width = <1>;
spi-rx-bus-width = <1>;
reg = <0>;
aic,encrypt; // 标记该存储设备使能 SPI_ENC
aic,spi-id = <1>; // 设置当前存储设备所挂载的 SPI 控制器 ID
status = "okay";
};
};
密钥配置
SPI_ENC 模块使用 AES-128-CTR 算法对 SPI 总线数据进行加解密,该算法在计算时的密钥有两部分
-
128 bit AES 密钥(KEY)
-
128 bit 数据块的 COUNTER 值
其中 KEY 直接使用 eFuse 中的 SPI_ENC_KEY
,COUNTER 值则由几部分共同产生
-
eFuse 中的
SPI_ENC_NONCE
-
DTS 中配置的
aic,spienc-tweak
-
访问数据所在的地址
address
因此在使能 SPI_ENC 时,需要设置以下的 eFuse 信息:
eFuse 区域 | 大小(BIT) | 说明 |
---|---|---|
SPI_ENC_KEY | 128 | AES 密钥,烧录后应设置不可读写 |
SPI_ENC_NONCE | 64 | 用于生成 COUTNER 的随机数,烧录后应设置不可读写 |
SPI_ENC_ENABLE BIT | 1 | 使能 BROM 的 SPI_ENC 功能,才可正确启动 |
具体 eFuse 区域的地址,请参考芯片的数据手册。