支持的芯片
Ameba SoC |
RTL8721Dx |
RTL8726E |
RTL8720E |
RTL8730E |
---|---|---|---|---|
支持状态 |
N |
Y |
Y |
Y |
概述
ECDSA 算法理论上支持所有不超过 256 位的曲线,但在我们的 ROM 代码中,仅支持以下 8 种曲线:
SECP256K1
SECP256R1
CURVE25519
SECP192K1
SECP224K1
SECP192R1
SECP224R1
BP256R1
ECDSA 实现的功能包括:密钥对生成、ECDH 密钥协商、签名生成、公钥验签,以及基础数学运算。
备注
ECDSA 可被 NP 和 AP 访问,但如果多核同时调用 API 操作 ECDSA,将导致 ECDSA 功能异常。
请采取必要的保护措施,确保某一时刻仅有一个核操作 ECDSA。
ECDSA OTP
ECDSA 引擎可以通过以下两种方式下载私钥:
用户将私钥传递给 API,由 API 将其写入 ECDSA 寄存器中。
ECDSA 自动下载 ECDSA OTP 密钥。
OTP 物理映射可存储两个供 ECDSA 使用的私钥,仅能通过 ECDSA 触发访问,且无法被篡改或读取。前提是私钥需预先烧录到 OTP 物理映射中。
OTP 密钥 |
地址 |
大小 |
默认值 |
描述 |
---|---|---|---|---|
ECDSA_PRI_KEY1 |
物理映射 0x280 |
32 字节 |
每个字节为 0xFF |
如果 OTPKEY=1,将此密钥加载至 ECDSA 引擎作为私钥 |
ECDSA_PRI_KEY2 |
物理映射 0x2A0 |
32 字节 |
每个字节为 0xFF |
如果 OTPKEY=2,将此密钥加载至 ECDSA 引擎作为私钥 |
ECDSA_PRI_KEY1_Read_Protection |
物理映射 0x366[2] |
1 比特 |
1 |
0:启用 ECDSA Key1 读保护,禁止密钥被读出 1:禁用 ECDSA Key1 读保护 |
ECDSA_PRI_KEY1_Write_Protection |
物理映射 0x366[3] |
1 比特 |
1 |
0:启用 ECDSA Key1 写保护,禁止密钥被黑客写为全 0 1:禁用 ECDSA Key1 写保护 |
ECDSA_PRI_KEY2_Read_Protection |
物理映射 0x366[4] |
1 比特 |
1 |
0:启用 ECDSA Key2 读保护,禁止密钥被读出 1:禁用 ECDSA Key2 读保护 |
ECDSA_PRI_KEY2_Write_Protection |
物理映射 0x366[5] |
1 比特 |
1 |
0:启用 ECDSA Key2 写保护,禁止密钥被黑客写为全 0 1:禁用 ECDSA Key2 写保护 |
烧写 OTP 物理地址映射的流程如下:
生成密钥
使用命令
efuse wraw <address> <length> <data>
将密钥写入 OTP 物理地址映射假设私钥(u8 格式)如下:
u8 key1[32]= { 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01 };
通过以下命令烧写 ECDSA Key1:
efuse wraw 0x280 20 ffeeddccbbaa99887766554433221100efcdab8967452301efcdab8967452301
使用
efuse rraw
命令回读 OTP 密钥以验证写入是否正确。若验证失败,需重新写入efuse rraw 0x280
确认密钥写入无误后,启用密钥读保护和写保护,防止密钥泄露或被篡改
efuse wraw 0x366 1 f9
ECDSA 密钥缓冲区顺序
ECDSA引擎的密钥缓冲区遵循小端模式。
例如,某个32位密钥为: 0x0123456789abcdef0123456789abcdef00112233445566778899aabbccddeeff
将其以 u8 格式存入数组为:
u8 key1[32]={
0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa, 0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01
};
此时,该数组地址可作为 API 参数。
如果将其烧写至 OTP 作为 ECDSA_PRI_KEY1
,OTP中的布局为:
0x280 |
ff |
ee |
dd |
cc |
bb |
aa |
99 |
88 |
77 |
66 |
55 |
44 |
33 |
22 |
11 |
00 |
0x290 |
ef |
cd |
ab |
89 |
67 |
45 |
23 |
01 |
ef |
cd |
ab |
89 |
67 |
45 |
23 |
01 |
使用说明
启用 ECDSA 引擎时钟
确保 ECDSA 功能和时钟已启用,否则功能将挂起。
RCC_PeriphClockCmd(APBPeriph_ECDSA, APBPeriph_CLOCK_NULL, ENABLE);
开始 ECDSA 引擎计算
初始化参数后,调用
xxx()
(此处补充完整的API名称) 以启动 ECDSA 引擎计算。