IC:

支持的芯片

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 物理地址映射的流程如下:

  1. 生成密钥

  2. 使用命令 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
    
  3. 使用 efuse rraw 命令回读 OTP 密钥以验证写入是否正确。若验证失败,需重新写入

    efuse rraw 0x280
    
  4. 确认密钥写入无误后,启用密钥读保护和写保护,防止密钥泄露或被篡改

    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

使用说明

  1. 启用 ECDSA 引擎时钟

    确保 ECDSA 功能和时钟已启用,否则功能将挂起。

    RCC_PeriphClockCmd(APBPeriph_ECDSA, APBPeriph_CLOCK_NULL, ENABLE);
    
  2. 开始 ECDSA 引擎计算

    初始化参数后,调用 xxx() (此处补充完整的API名称) 以启动 ECDSA 引擎计算。