ACRYP
1. 简介
芯来非对称密码加速器 (ACRYP) 适用于嵌入式应用。它具备基本算术运算和常用的密码学操作的能力。配合驱动程序,它可以灵活地支持流行的上层应用。
2. 主要特性
本设备的主要特性如下:
RSA
RSA 密钥长度最大支持 8192 位
RSA 密钥对生成
ECC (包括 SM2)
GF(p) 和 \(GF(2^m)\) 域上的 ECC 曲线
GF(p) 域上 ECC 密钥长度最大支持 521 位
\(GF(2^m)\) 域上 ECC 密钥长度最大支持 571 位
支持短 Weierstrass 曲线和 Koblitz 曲线,包括来自标准 NIST、brainpool、SEC 2 和 SM2 的曲线
蒙哥马利曲线 25519/448
(扭) 爱德华兹曲线 25519/448
能力
大数算术运算
非对称密码学操作
支持 GF(p) 和 \(GF(2^m)\) 的双域处理器
可配置的系统总线接口(寄存器配置总线)
可配置的字长(32 位或 64 位)
可配置的 SRAM 深度
可编程的操作数大小,从字长到 8192 位
丰富的控制选项向用户开放内置操作,便于构建新的应用
与驱动程序配合工作时支持以下应用
密钥交换方案 (DHKE, ECDH, X25519/X448)
加密方案 (RSAES-OAEP, RSAES-PKCS1-v1_5, ECIES)
签名方案 (RSASSA-PSS, RSASSA-PKCS1-v1_5, DSA, ECDSA, Ed25519/Ed448, SM2 签名)
RSA CRT,素性测试
参数
性能:RSA-2048 7.1M 时钟周期,ECC-P256 0.42M 时钟周期
硅数据:在 SMIC 40nm 工艺下,时钟频率为 230MHz,逻辑面积为 92508 \(µm^2\)
3. 功能描述
符号与约定
符号
本文档使用的记号如下:
ACRYP:非对称密码加速器
{a}_blen:变量 a 的大数位长度
{a}_wlen:变量 a 在实现中的大数字长度
alg_blen:算法的大数位长度
alg_blen(.):确定 alg_blen 的函数。对于 GF(p),等于 eff_blen(.);对于 \(GF(2^{m})\),等于 deg(.)
deg(.) 多项式的次数
eff_blen(.):无符号数或多项式的有效位长度,不包括前导零
\(GF(2^{m})\):次数为 m 的扩展二元域
GF(p):素数阶 p 的有限域
LSB:数字的最低有效位
LSW:数字的最低有效字
Mont(.):蒙哥马利变换。将数字转换为蒙哥马利形式,Mont(a) = MontMult(a, R2)
MontMult(A, B), MM(A, B):蒙哥马利乘法。\(MontMult(A, B) = ABR^{-1} \mod N\)
MSB:数字的最高有效位
MSW:数字的最高有效字
MSW_m1:MSW 的下一个字。如果一个数字只有一个字,则 MSW_m1 和 MSW 指向同一个字
N, P:通常它们是模数
n_wlen:实现中大数的字长度
R:蒙哥马利乘法的重要参数。对于 GF(p), \(R = 2^{n\_wlen \cdot w}\); 对于 \(GF(2^{m})\),\(R = x^{n\_wlen \cdot w}\)
R2:\(R2 = RR \mod N\)
RR:RR = R·R
u, μ:对于 GF(p),\(μ = -N_0^{-1} \mod 2^{w}\); 对于 \(GF(2^{m})\),\(μ = -N_0^{-1} \mod x^{w}\),\(N_0\) 是 N 的 LSW
w, wordsize:本设备的字大小,32 或 64。由存储器数据宽度和内部的加法器/乘法器宽度决定
⌈·⌉:向上取整函数。返回大于或等于指定数字的最小整数值
⌊·⌋:向下取整函数。返回小于或等于指定数字的最大整数值
(a,b), [a,b], [a,b), (a,b]:分别表示:math:a < x < b, a ≤ x ≤ b, a ≤ x < b, a < x ≤ b,方括号表示端点包含在内,圆括号表示端点排除在外
如果不会引起混淆,以下术语可以互换使用
大数、长数字、多精度整数、任意精度整数、数字、数据、变量
算法、协议、应用。例如,EdDSA 可以称为算法、签名协议或应用
大小、长度
w, wordsize, 字大小
N, P,当用作模数时
u, μ
MontMult(A,B), MM(A,B)
模块、块、设备
SRAM, 本地 SRAM
约定
这里的大部分公式都是模算术。当模数可由上下文明确时,为简洁起见可省略(mod 𝑛)部分。
有两种方式描述如何编程寄存器:
register.field = value。直接赋值给 register.field
register.field <- value。该字段控制设备的特定参数。赋值给 register.field 以使该参数具有指定的值。需要进行少量计算来获得该值,而冗长详细的描述则被省略。例如,DATALEN.len_a <- n_wlen。DATALEN.len_a 控制 n_wlen。现在需要用 n_wlen=3 配置设备。根据 len_a 的描述,用户在 GF(p) 中将 len_a 设置为 2,在 \(GF(2^{m})\) 中设置为 3。
长度与算法
这里有两种数据长度。它们是不同的。
alg_blen,算法的大数长度(单位:位)
理论上,每个算法都有一个固有的数字长度。所有完全约减后的数据都可以用此长度的非负整数表示。例如,使用 ECC 曲线 NIST P-256 的 ECDSA,其长度为 256 位
n_wlen,实现的大数长度(单位:字)
实现建立在软件和硬件之上。此长度表示实现算法所用的大数长度。它反映了实现的一个能力——支持算法的程度。例如,使用约 256 位大数长度的实现可以支持 NIST P-256 或更低,但不能支持 NIST P-521。在实现内部,一个完整的数字由 n_wlen 个连续的字组成。几乎所有的内部数字都是这个长度,包括输入、中间数据和结果
长度设置影响性能。数字按字处理。更长的长度支持更大的范围(例如,密钥大小),但需要更多的计算时间。适当的长度可以使计算时间受益,而超出需要的长度将导致更多的计算时间。因此,数据长度是与操作或实现相关联的属性。
这是一个重要参数。许多配置都依赖于它。它在整个文档中使用。
区分这两种长度很重要。例如,一个日历计数的应用程序计算年、月和日。所有数字都小于 \(3000 < 2^{12}\),所以 alg_blen=12。软件程序使用 32 位整数 (int32) 编写,所有数字都作为 int32 处理。它在 8 位 CPU 上运行,字大小 w=8。因此 n_wlen=32/8=4。在这个实现中的大数是 int32。CPU 逐字节处理数据且不理解 int32。软件按 int32 处理数据。软件中的一个 int32 操作在 CPU 中分解为 n_wlen=4 个字节操作。在软件和 CPU 的协作下,实现正确处理大数。
这两种长度之间的映射将在后面讨论。更多详情请参阅 “长度” 章节。
数字
这里有三种大数:
在 GF(p) 中的有符号数
它以二进制补码形式表示。MSB 是符号位。变量 b[b_blen:0] 表示数字 \(-b[b\_blen]2^{b\_blen} + \sum_{i=0}^{b\_blen-1} b[i] \times 2^i\)
在 GF(p) 中的无符号数
它以普通的二进制形式表示。没有符号位。变量 b[b_blen-1:0] 表示数字 \(\sum_{i=0}^{b\_blen-1} b[i] \times 2^i\)
在 \(GF(2^{m})\) 中的多项式。
它表示为多项式系数的二进制数组。变量 b[b_blen-1:0] 表示多项式 \(\sum_{i=0}^{b\_blen-1} b[i] \times x^i\)。为了简洁并与 GF(p) 的写法统一,符号 x 可能被替换为’2’,这也是一个符号,不是整数。
框图
这里是本设备的框图:
图 3.1: ACRYP 框图
它包含以下组件:
Bus inf0:总线接口 0。CPU 通过它访问寄存器文件。总线宽度为 32 位
Bus inf1:总线接口 1。CPU 通过它访问本地 SRAM,写入数据和读取结果。总线宽度为字大小
寄存器文件:配置和状态寄存器的集合。它是本设备的编程接口。本设备的功能通过此寄存器文件对用户开放。
中断:向 CPU 发出的中断。
SRAM:本地 SRAM。可从总线访问。在计算期间也由内部逻辑使用。计算期间涉及的所有大数都存储在此处,包括输入数据、结果和中间数据。
核心:负责各种计算的算法核心。
以下是关于系统及其工作原理的简单描述。
本设备提供一组操作,包括基本操作和复合操作。这些操作通过寄存器文件对用户开放。算法可以通过一系列操作来实现。在此设备中处理的数据是大数并存储在本地 SRAM 中。(关于大数格式的更多详情,请参阅 “数据格式” 章节。本设备支持双域, GF(p) 和 \(GF(2^{m})\)。
使用的基本步骤如下。
用户有一个要执行的操作。
将输入数据写入 SRAM。
根据操作要求配置寄存器文件。然后开始计算。
通过轮询或中断等待操作完成。
从 SRAM 读取结果。
算术运算
本设备的功能涉及大数算术和模算术。这种算术通常是计算密集型的,数据流量非常小。硬件加速可以大大减轻 CPU 的负担。该硬件能够处理非对称加密中常用的一些基本算术和复合操作(表3.1 硬件支持的算术运算)。有关每种算术和操作的更多详情,请参阅 “流程” 章节。
算术运算 |
公式 |
描述 |
注释 |
|---|---|---|---|
基本算术运算 |
|||
大数加法 / 减法 |
s = c0·a0 ± c1·a1 ± c2·a2 |
给定c0, c1, c2, a0, a1, a2, 求 s |
|
大数乘法 |
c = a·b |
给定a, b, 求 c |
|
大数模运算 |
r = a mod b |
给定a, b, 求 r |
|
模逆 |
\(y = x^{-1} \mod N\) |
给定x, N, 求 y |
|
蒙哥马利模乘相关算术 |
|||
INV_N0 |
\(μ = -N_0^{-1} \mod 2^w\) |
给定 \(N\_0\), 求 μ |
辅助 |
蒙哥马利乘法 |
\(C = ABR^{-1} \mod N\) |
给定 \(A, B, N, R = 2^{n\_wlen \cdot w}\), 求 C |
|
RSA 相关算术 |
|||
模幂运算 |
\(c = m^{e} \mod N\) |
给定m, e, N, 求 c |
|
ECC 相关算术 |
|||
点加 |
\(R(x, y) = P(x, y) + Q(x, y)\) |
给定点 P 和 Q, 求 R |
|
倍点 |
\(R(x, y) = 2 * P(x, y)\) |
给定点 P, 求 R |
|
标量乘法 |
\(R(x, y) = k * G(x, y)\) |
给定点 G, 求 R |
|
坐标变换 |
\(R(x, y) = PTC(P(x, y, z))\) |
将射影坐标和蒙哥马利形式的点 P 变换为仿射坐标的点 R |
并非所有类型的流行算术都仅由硬件支持。有些可以通过驱动和硬件的组合实现(需要多次硬件操作)
算术运算 |
公式 |
描述 |
注释 |
|---|---|---|---|
基本算术运算 |
|||
模加法 |
s = a + b mod N |
给定a, b, N, 求 s |
|
模乘法 |
c = a·b mod N |
给定a, b, N, 求 c |
|
RRmodN |
\(R2 = R^{2} \mod N\) |
给定 \(N, R = 2^{n\_wlen \cdot w}\), 求 R2 |
辅助 |
ECC 相关算术 |
|||
曲线点测试 |
E(P(x,y)) = 0 |
给定 ECC 曲线 E, 点 P, 检查 P 是否在 E 上 |
数据格式
大数根据上下文和操作被解释为无符号数、有符号数或多项式之一。它由多个字组成
长度
这里描述了从 alg_blen 到 n_wlen 的合理长度映射。
alg_blen(单位:位)是算法的大数长度。
n_wlen(单位:字)是实现的大数长度。它指示数据处理能力。对于一个操作,几乎所有的内部数据都是这个长度。
有关 alg_blen 和 n_wlen 的更多详情,请参阅 “长度与算法” 章节。
操作处理数据。用户应告知它将要处理多大尺寸的数据。
对于一些操作,例如 OP_MUL / OP_MOD,每个操作数或结果的长度可以分别指定。在这种情况下,与 n_wlen 无关。
对于其他操作,例如 OP_MontMult / OP_MEXP,所有数据共享一个公共长度。此外,当多个操作串联时,它们也共享相同的长度。从这个意义上说,该长度充当一个上下文。那就是 n_wlen。
给定 alg_blen,确定一个适当的 n_wlen 如下。
GF(p)
\(GF(2^{m})\)
通常,给定一个模数,很容易确定 alg_blen。因此,可以定义一个函数 alg_blen()。更具体地说,在模算术中有以下情况。
GF(p), alg_blen(p) = eff_blen(p), 那么大数 p 的 MSW 是一个有符号字,要么全0,要么全1
\(GF(2^{m})\), alg_blen(域多项式) = deg(域多项式) = m。注意 m 是域多项式的次数,而不是有效位长度 (m+1)。
例如:
RSA 1024/2048/.…, alg_blen=1024/2048/.…
GF(p) ECC 曲线 P-192/224/256/.…, alg_blen=192/224/256/.…
\(GF(2^{m})\) ECC 曲线 B-163/233/283/.…, alg_blen=163/233/283/.…
当 wordsize=32, GF(p) ECC 曲线 NIST P-256。那么 alg_blen=256, n_wlen=9。内存中的数据有 9 个字而不是 8 个。
当 wordsize=32, \(GF(2^{m})\) ECC 曲线 NIST B-163。那么 alg_blen=163, n_wlen=6。内存中的数据有 6 个字。
提示:(强烈推荐)所有情况都使用上述公式的长度,那么可以避免很多麻烦。虽然不是最优的,但它对于所有支持的算法来说是合理的(对性能影响不大)且足够的(可以安全接受广泛的输入)。如果坚持使用更短的长度,必须非常了解长度背后的理论。
注意:在硬件中运行算法时,保存大数的变量要比算法的固有长度略长。这是因为(1)存储在内存中的数据被扩展以对齐字边界。(2)RSA 或 ECC 操作是建立在一系列基本算术运算基础上的复合操作。在 GF(p) 中,需要容纳溢出并提高效率。需要额外的位来保存进位。在计算期间,数据不完全通过模运算约减,而是保存同余值。因此,长度会增加。额外的位应足够长,考虑到各种增长。
在 n_wlen 上下文下访问 SRAM 中的大数时,应遵循以下规则。
写入和从 SRAM 读取的数据有 n_wlen 个字。
如果输入数据短于该长度,则扩展它。对于有符号数执行符号扩展,否则在前面填充零。
如果已知结果短于该长度,则截断并获取低位部分。
字节序
对于存储在本地 SRAM 中的数据,字序是小端序。也就是说,LSW 存储在较低地址。在一个字内,字节序是小端序。也就是说,LSB 在较低地址。
例如,wordsize=32, alg_blen=163, n_wlen=6,以及 GF(p) 中的一个无符号数 A[162:0]。
A[162:0]=0x5_4a4b4c4d_3a3b3c3d_2a2b2c2d_1a1b1c1d_0a0b0c0d
它被扩展到 A[191:0] 并存储在 SRAM 中,如图 3.2 长度扩展与字节序所示。它总共占据 7 个字。A[31:0] = 0x0a0b0c0d 位于起始地址,A[63:0] = 0x1a1b1c1d 位于下一个。A[191:160] = {29’b0, A[162:0]} = 0x00000005 位于最高地址。
图 3.2: 长度扩展与字节序
坐标
以下是各种曲线中使用的坐标
GF(p) 短 Weierstrass 曲线
仿射坐标,P(x, y)
Jacobian 坐标,P(X, Y, Z),其中
无穷远点是 \(O(T^2, T^3, 0)\), 对于任何非零 T。
仿射坐标和蒙哥马利形式,P(xr, yr),其中
Jacobian 坐标和蒙哥马利形式,P(Xjr, Yjr, Zjr),其中
\(GF(2^{m})\) 短 Weierstrass 曲线
仿射坐标,P(x, y)
Lopez-Dahab 坐标,P(X, Y, Z),其中
无穷远点是 \(O(T, 0, 0)\), 对于任何非零 T。
仿射坐标和蒙哥马利形式,P(xr, yr),其中
Lopez-Dahab 坐标和蒙哥马利形式,P(Xjr, Yjr, Zjr),其中
蒙哥马利曲线
仿射坐标,P(u)
射影坐标,P(U),其中
无穷远点为 O(T,0),其中 T 为非零值
仿射坐标与蒙哥马利形式:P(ur),其中:
射影坐标与蒙哥马利形式:P(Ujr),其中:
(扭曲) Edwards 曲线
仿射坐标,P(x, y)
扩展齐次坐标,P(X, Y, Z, T),其中
中性点 \(O(0, 1)\), 或对任意非零 Z, \(O(0, Z, Z, 0)\)
仿射坐标和蒙哥马利形式,P(xr, yr),其中
扩展齐次坐标与蒙哥马利形式,P(Xjr, Yjr, Zjr, Tjr),其中
存储器空间
该设备包含寄存器文件和一片本地 SRAM。两者均可通过总线直接访问,并分配有存储器映射地址空间。它们具有独立的总线接口,因此具有独立的基地址。
寄存器空间
寄存器文件的空间信息,请参阅章节 “寄存器”。
SRAM 空间
本地 SRAM 用于存储输入数据、中间数据和结果。它通过一个专用的总线接口连接到系统总线,该接口的数据宽度为字长。分配给 SRAM 的存储器空间见表3.3 SRAM 地址空间
注意: 分配的空间大小大于或等于 SRAM 的实际大小。SRAM 大小的相关信息,请参阅章节 “存储器”。
地址 (字长=32) |
地址 (字长=64) |
数据宽度 |
默认值 |
单位 |
描述 |
|---|---|---|---|---|---|
0x0000-0x1FFC |
0x0000-0x1FF8 |
字长 |
不复位 |
字节 |
从总线看到的 SRAM 地址空间 |
0x0000-0x07FF |
0x0000-0x03FF |
字长 |
不复位 |
字 |
从内部逻辑看到的 SRAM 地址空间 |
地址值
需要注意的是,从总线访问的地址值和从内部逻辑(即通过寄存器配置)访问的地址值是不同的,尽管它们指向 SRAM 的同一位置。前者以字节为单位,后者以字为单位。例如,当字长为 32 位时,SRAM 中第二个位置的地址从总线角度看是 0x04,而从内部逻辑角度看是 0x01。
访问大小
从总线访问 SRAM 数据时,必须以字长为单位。不支持任何更小的访问粒度,其行为是未定义的。例如,当字长为 64 位时,软件应使用 64 位的读或写操作来访问 SRAM,不支持 32 位访问。
保留区域
SRAM 有一个位于高地址端的保留区域,用于硬件存储中间数据。保留变量的数量是固定的,总共 14 个,每个命名为 RSVD_ADDR_n。每个变量的大小为 (DATALEN.len_a+1) 个字,可通过寄存器编程。因此,该区域的大小为 14 × (DATALEN.len_a+1) 个字,是灵活的。当运行长度较小的算法时,保留区域的大小可能会缩小,部分空间转移到非保留区域,可供软件使用。某些操作使用的保留变量较少。(见表 3.4 SRAM 中的保留区域)
注意: 用户可以访问此区域以获取中间数据,但用户不应在此区域分配变量。
操作 |
保留地址范围 (单位:字) |
|---|---|
OP_INV |
变量:RSVD_ADDR_0 - RSVD_ADDR_2 范围:[D - 3s, D] |
ECC |
变量:RSVD_ADDR_0 - RSVD_ADDR_13 范围:[D - 14s, D] |
其他 |
不适用 |
|
参数
表3.5 为性能数据,单位 op/s 代表每秒操作次数。例如,3 op/s 表示该设备每秒能完成 3 次操作。
注意操作列。硬件操作(OP*,如 OP_MEXP、OP_kMUL 等)的数据来自 RTL 仿真。协议(如签名、验证、ECDSA 等)的数据来自运行平台,由本硬件与运行在 CPU 上的驱动软件协同工作收集。
算法 |
操作 |
时钟周期 |
时钟周期 |
op/s @100MHz |
op/s @100MHz |
|---|---|---|---|---|---|
w=32 |
w=64 |
w=32 |
w=64 |
||
RSA 1024 |
OP_MEXP |
1013k |
324k |
98 |
309 |
RSA 1024 |
OP_MEXP (exponent=0x10001) |
15k |
5k |
6.9k |
21.4k |
RSA 1024 |
Sign (CRT/blinding) |
||||
RSA 1024 |
Verify (pubkey=0x10001) |
||||
RSA 2048 |
OP_MEXP |
7141k |
2024k |
14 |
49 |
RSA 2048 |
OP_MEXP (exponent=0x10001) |
52k |
15k |
1.9k |
6.8k |
RSA 2048 |
Sign (CRT/blinding) |
15 |
|||
RSA 2048 |
Verify (pubkey=0x10001) |
1.4k |
|||
RSA 3072 |
OP_MEXP |
||||
RSA 3072 |
OP_MEXP (exponent=0x10001) |
||||
RSA 3072 |
Sign (CRT/blinding) |
||||
RSA 3072 |
Verify (pubkey=0x10001) |
||||
RSA 4096 |
OP_MEXP |
53606k |
14272k |
1 |
7 |
RSA 4096 |
OP_MEXP (exponent=0x10001) |
192k |
52k |
521 |
1.9k |
RSA 4096 |
Sign (CRT/blinding) |
3 |
|||
RSA 4096 |
Verify (pubkey=0x10001) |
446 |
|||
RSA 8192 |
OP_MEXP |
415526k |
107194k |
0 |
0 |
RSA 8192 |
OP_MEXP (exponent=0x10001) |
744k |
192k |
134 |
521 |
RSA 8192 |
Sign (CRT/blinding) |
||||
RSA 8192 |
Verify (pubkey=0x10001) |
||||
GF(𝑝) ECC 192 |
OP_kMUL |
259k |
142k |
387 |
705 |
GF(𝑝) ECC 192 |
ECDSA - Sign |
253 |
|||
GF(𝑝) ECC 192 |
ECDSA - Verify |
140 |
|||
GF(𝑝) ECC 192 |
ECDH |
87 |
|||
GF(𝑝) ECC 224 |
OP_kMUL |
303k |
227k |
330 |
440 |
GF(𝑝) ECC 224 |
ECDSA - Sign |
189 |
|||
GF(𝑝) ECC 224 |
ECDSA - Verify |
104 |
|||
GF(𝑝) ECC 224 |
ECDH |
64 |
|||
GF(𝑝) ECC 256 |
OP_kMUL |
420k |
254k |
238 |
395 |
GF(𝑝) ECC 256 |
ECDSA - Sign |
158 |
|||
GF(𝑝) ECC 256 |
ECDSA - Verify |
83 |
|||
GF(𝑝) ECC 256 |
ECDH |
50 |
|||
GF(𝑝) ECC 384 |
OP_kMUL |
1057k |
513k |
94 |
195 |
GF(𝑝) ECC 384 |
ECDSA - Sign |
71 |
|||
GF(𝑝) ECC 384 |
ECDSA - Verify |
35 |
|||
GF(𝑝) ECC 384 |
ECDH |
18 |
|||
GF(𝑝) ECC 521 |
OP_kMUL |
2270k |
927k |
44 |
107 |
GF(𝑝) ECC 521 |
ECDSA - Sign |
36 |
|||
GF(𝑝) ECC 521 |
ECDSA - Verify |
17 |
|||
GF(𝑝) ECC 521 |
ECDH |
9 |
|||
\(GF(2^{m})\) ECC 163 |
OP_kMUL |
175k |
113k |
572 |
892 |
\(GF(2^{m})\) ECC 163 |
ECDSA - Sign |
||||
\(GF(2^{m})\) ECC 163 |
ECDSA - Verify |
||||
\(GF(2^{m})\) ECC 233 |
OP_kMUL |
315k |
173k |
318 |
579 |
\(GF(2^{m})\) ECC 233 |
ECDSA - Sign |
||||
\(GF(2^{m})\) ECC 233 |
ECDSA - Verify |
||||
\(GF(2^{m})\) ECC 283 |
OP_kMUL |
478k |
289k |
209 |
346 |
\(GF(2^{m})\) ECC 283 |
ECDSA - Sign |
||||
\(GF(2^{m})\) ECC 283 |
ECDSA - Verify |
||||
\(GF(2^{m})\) ECC 409 |
OP_kMUL |
1149k |
554k |
87 |
180 |
\(GF(2^{m})\) ECC 409 |
ECDSA - Sign |
||||
\(GF(2^{m})\) ECC 409 |
ECDSA - Verify |
||||
\(GF(2^{m})\) ECC 571 |
OP_kMUL |
2534k |
964k |
39 |
103 |
\(GF(2^{m})\) ECC 571 |
ECDSA - Sign |
||||
\(GF(2^{m})\) ECC 571 |
ECDSA - Verify |
||||
蒙哥马利曲线 25519 |
OP_MMCURVE |
301k |
182k |
332 |
550 |
蒙哥马利曲线 25519 |
X25519 |
75 |
|||
蒙哥马利曲线 448 |
OP_MMCURVE |
1092k |
444k |
91 |
225 |
蒙哥马利曲线 448 |
X448 |
21 |
|||
(扭) 爱德华兹曲线 25519 |
ED25519kMUL |
390k |
236k |
256 |
424 |
(扭) 爱德华兹曲线 25519 |
EdDSA - Sign |
||||
(扭) 爱德华兹曲线 25519 |
EdDSA - Verify |
||||
(扭) 爱德华兹曲线 448 |
ED25519kMUL |
1515k |
599k |
66 |
167 |
(扭) 爱德华兹曲线 448 |
EdDSA - Sign |
||||
(扭) 爱德华兹曲线 448 |
EdDSA - Verify |
||||
SM2 |
OP_kMUL |
420k |
254k |
238 |
395 |
SM2 |
Sign |
||||
SM2 |
Verify |
919k |
108 |
||
SM2 |
Verify (fixed curve) |
908k |
110 |
表 3.6 为硅片数据
工艺 |
字 |
频率 MHz |
总面积 μm² |
组合逻辑面积 μm² |
RAM 面积 μm² |
总单元数 |
时序单元数 |
时钟门控比率 |
带 DFT |
带 SRAM |
备注 |
|---|---|---|---|---|---|---|---|---|---|---|---|
SMIC 40nm |
32 |
230 |
172599 |
32107 |
72401 |
44978 |
4295 |
96.23% |
带 DFT |
带 SRAM |
直流模式,去平坦化 |
SMIC 40nm |
64 |
200 |
312659 |
45784 |
73905 |
111945 |
6024 |
97.32% |
带 DFT |
带 SRAM |
直流模式,去平坦化 |
TSMC 28nm |
32 |
600 |
73921 |
11984 |
35734 |
44941 |
4295 |
96.23% |
带 DFT |
带 SRAM |
直流模式,去平坦化 |
TSMC 28nm |
64 |
500 |
123984 |
17020 |
35074 |
108671 |
6024 |
97.32% |
带 DFT |
带 SRAM |
直流模式,去平坦化 |
TSMC 22nm |
32 |
850 |
40458 |
12131 |
/ |
46056 |
4291 |
96.23% |
带 DFT |
不带 SRAM |
直流模式,去平坦化 |
TSMC 22nm |
64 |
800 |
106392 |
17721 |
/ |
125273 |
6020 |
97.32% |
带 DFT |
不带 SRAM |
直流模式,去平坦化 |
1. 编程流程
编程流程在本设备的驱动程序中描述
5. 中断
该设备有一个中断信号。这是一个电平中断。它是一个操作完成中断。没有错误中断。操作完成后会产生中断。中断是可屏蔽的。
相关寄存器是 INTST 和 INTEN。
6. 寄存器
ACRYP_RF 寄存器
寄存器的偏移地址及其在 ACRYP_RF 中的对应关系见表 6.1 ACRYP_RF 中的寄存器偏移地址。
偏移量 |
寄存器名称 |
功能描述 |
|---|---|---|
0x0 |
IP_VER |
IP 版本号 |
0x4 |
GIT_VER |
Git 版本号 |
0x8 |
OPCODE |
操作码寄存器 |
0xC |
MMACCTRL |
MMAC 控制寄存器 |
0x10 |
CTRLOPT |
控制选项寄存器 |
0x14 |
CONTEXT2 |
上下文寄存器 2 |
0x18 |
CONTEXTO |
上下文寄存器 0 |
0x1C |
VARADDR0 |
变量地址寄存器 0 |
0x20 |
VARADDR1 |
变量地址寄存器 1 |
0x24 |
VARADDR2 |
变量地址寄存器 2 |
0x28 |
KEYT |
密钥寄存器 |
0x2C |
DATALEN |
数据长度寄存器 |
0x30 |
KEYSIZE |
密钥大小寄存器 |
0x34 |
GET_U_L |
获取 u 寄存器 L |
0x38 |
GET_U_H |
获取 u 寄存器 H |
0x3C |
INTST |
中断状态寄存器 |
0x40 |
INTEN |
中断使能寄存器 |
0x44 |
VARSIZE |
内部变量大小寄存器 |
0x48 |
INVSHFCNT |
模逆移位计数寄存器 |
0x4C |
CONTEXT1 |
上下文寄存器 1 |
IP 版本号寄存器
地址偏移:0x0
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
IP_VER |
23:0 |
RO |
0x010105 |
IP 版本号 |
Reserved |
31:24 |
/ |
0x0 |
/ |
IP 的 GITLAB 版本寄存器
地址偏移:0x4
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
GIT_VER |
31:0 |
RO |
0x0 |
Git 版本号 |
操作码寄存器
地址偏移:0x8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
cmd |
4:0 |
RW |
0x0 |
|
保留 |
31:5 |
/ |
0x0 |
/ |
MMAC 控制寄存器
地址偏移:0xC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
two_term |
0 |
RW |
0x0 |
|
mmac_op0 |
1 |
RW |
0x0 |
|
mmac_op1 |
2 |
RW |
0x0 |
|
diven |
3 |
RW |
0x0 |
|
coe0_enc |
9:4 |
RW |
0x0 |
移位系数 c0 的编码。它控制 a0 的左移。合法范围是 [0, wordsize)。 |
保留 |
11:10 |
/ |
0x0 |
/ |
coe1_enc |
17:12 |
RW |
0x0 |
移位系数 c1 的编码。它控制 a1 的左移。合法范围是 [0, wordsize)。 |
保留 |
19:18 |
/ |
0x0 |
/ |
coe2_enc |
25:20 |
RW |
0x0 |
|
保留 |
27:26 |
/ |
0x0 |
/ |
opa_zero |
28 |
RW |
0x0 |
|
保留 |
31:29 |
/ |
0x0 |
/ |
控制选项寄存器
地址偏移:0x10
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
normalize |
0 |
RW |
0x0 |
|
保留 |
3:1 |
/ |
0x0 |
/ |
mod_opt |
4 |
RW |
0x0 |
|
保留 |
7:5 |
/ |
0x0 |
/ |
ptc |
8 |
RW |
0x0 |
|
保留 |
31:9 |
/ |
0x0 |
/ |
上下文寄存器 2
地址偏移:0x14
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
addr_b |
10:0 |
RW |
0x0 |
|
保留 |
11 |
/ |
0x0 |
/ |
addr_a |
22:12 |
RW |
0x0 |
|
保留 |
31:23 |
/ |
0x0 |
/ |
上下文寄存器 0
地址偏移:0x18
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
addr_n |
10:0 |
RW |
0x0 |
|
保留 |
11 |
/ |
0x0 |
/ |
addr_r2 |
22:12 |
RW |
0x0 |
R2 的地址,需要此值的计算将从此处获取它 |
保留 |
23 |
/ |
0x0 |
/ |
field |
24 |
RW |
0x0 |
|
保留 |
31:25 |
/ |
0x0 |
/ |
变量地址寄存器 0
地址偏移:0x1C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
addr1 |
10:0 |
RW |
0x0 |
|
保留 |
11 |
/ |
0x0 |
/ |
addr2 |
22:12 |
RW |
0x0 |
|
保留 |
31:23 |
/ |
0x0 |
/ |
变量地址寄存器 1
地址偏移:0x20
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
addr3 |
10:0 |
RW |
0x0 |
|
保留 |
11 |
/ |
0x0 |
/ |
addr4 |
22:12 |
RW |
0x0 |
|
保留 |
31:23 |
/ |
0x0 |
/ |
变量地址寄存器 2
地址偏移:0x24
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
addr5 |
10:0 |
RW |
0x0 |
|
保留 |
11 |
/ |
0x0 |
/ |
addr6 |
22:12 |
RW |
0x0 |
|
保留 |
31:23 |
/ |
0x0 |
/ |
密钥寄存器
地址偏移:0x28
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
k_t1 |
10:0 |
WO |
0x0 |
|
保留 |
11 |
/ |
0x0 |
/ |
t2 |
22:12 |
RW |
0x0 |
|
保留 |
31:23 |
/ |
0x0 |
/ |
数据长度寄存器
地址偏移:0x2C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
len_a |
9:0 |
RW |
0x0 |
|
保留 |
11:10 |
/ |
0x0 |
/ |
len_b |
21:12 |
RW |
0x0 |
|
保留 |
31:22 |
/ |
0x0 |
/ |
密钥大小寄存
地址偏移:0x30
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
ecc_rsa |
13:0 |
RW |
0x0 |
|
保留 |
31:14 |
/ |
0x0 |
/ |
获取 U 寄存器 L
地址偏移:0x34
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
ul |
31:0 |
RW |
0x0 |
u 的低 32 位 |
获取 U 寄存器 H
地址偏移:0x38
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
uh |
31:0 |
RW |
0x0 |
u 的高 32 位。当字长为 64 位时有效。 |
中断状态寄存器
地址偏移:0x3C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
int_sta |
0 |
W1C |
0x0 |
中断状态。写 1 清除 |
保留 |
31:1 |
/ |
0x0 |
/ |
中断使能寄存器
地址偏移:0x40
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
int_en |
0 |
RW |
0x0 |
|
保留 |
31:1 |
/ |
0x0 |
/ |
内部变量大小寄存器
地址偏移:0x44
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
var_size |
9:0 |
RW |
0x0 |
|
保留 |
31:10 |
/ |
0x0 |
/ |
模逆移位计数寄存器
地址偏移:0x48
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
gent |
12:0 |
RO |
0x0 |
最大公约数 (GCD) 的移位计数。OP_INV:结果 g |
保留 |
31:13 |
/ |
0x0 |
/ |
上下文寄存器 1
地址偏移:0x4C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
n_m2 |
10:0 |
RW |
0x0 |
|
保留 |
31:13 |
/ |
0x0 |
/ |