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’,这也是一个符号,不是整数。

框图

这里是本设备的框图:

ACRYP 框图

图 3.1: ACRYP 框图

它包含以下组件:

  • Bus inf0:总线接口 0。CPU 通过它访问寄存器文件。总线宽度为 32 位

  • Bus inf1:总线接口 1。CPU 通过它访问本地 SRAM,写入数据和读取结果。总线宽度为字大小

  • 寄存器文件:配置和状态寄存器的集合。它是本设备的编程接口。本设备的功能通过此寄存器文件对用户开放。

  • 中断:向 CPU 发出的中断。

  • SRAM:本地 SRAM。可从总线访问。在计算期间也由内部逻辑使用。计算期间涉及的所有大数都存储在此处,包括输入数据、结果和中间数据。

  • 核心:负责各种计算的算法核心。

以下是关于系统及其工作原理的简单描述。

本设备提供一组操作,包括基本操作和复合操作。这些操作通过寄存器文件对用户开放。算法可以通过一系列操作来实现。在此设备中处理的数据是大数并存储在本地 SRAM 中。(关于大数格式的更多详情,请参阅 “数据格式” 章节。本设备支持双域, GF(p) 和 \(GF(2^{m})\)。

使用的基本步骤如下。

  1. 用户有一个要执行的操作。

  2. 将输入数据写入 SRAM。

  3. 根据操作要求配置寄存器文件。然后开始计算。

  4. 通过轮询或中断等待操作完成。

  5. 从 SRAM 读取结果。

算术运算

本设备的功能涉及大数算术和模算术。这种算术通常是计算密集型的,数据流量非常小。硬件加速可以大大减轻 CPU 的负担。该硬件能够处理非对称加密中常用的一些基本算术和复合操作(表3.1 硬件支持的算术运算)。有关每种算术和操作的更多详情,请参阅 “流程” 章节。

表 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

并非所有类型的流行算术都仅由硬件支持。有些可以通过驱动和硬件的组合实现(需要多次硬件操作)

表 3.2:驱动与硬件组合支持的算术运算

算术运算

公式

描述

注释

基本算术运算

模加法

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)

\[n\_wlen = \left\lceil \frac{alg\_blen + 32}{wordsize} \right\rceil\]
  • \(GF(2^{m})\)

\[n\_wlen = \left\lceil \frac{alg\_blen + 1}{wordsize} \right\rceil\]

通常,给定一个模数,很容易确定 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 位于最高地址。

ACRYP 长度扩展与字节序

图 3.2: 长度扩展与字节序

坐标

以下是各种曲线中使用的坐标

GF(p) 短 Weierstrass 曲线

  • 仿射坐标,P(x, y)

  • Jacobian 坐标,P(X, Y, Z),其中

\[x = X / Z^2, y = Y / Z^3\]
  • 无穷远点是 \(O(T^2, T^3, 0)\), 对于任何非零 T。

  • 仿射坐标和蒙哥马利形式,P(xr, yr),其中

\[xr = x·R, yr = y·R\]
  • Jacobian 坐标和蒙哥马利形式,P(Xjr, Yjr, Zjr),其中

\[Xjr = X·R, Yjr = Y·R, Zjr = Z·R\]

\(GF(2^{m})\) 短 Weierstrass 曲线

  • 仿射坐标,P(x, y)

  • Lopez-Dahab 坐标,P(X, Y, Z),其中

\[x = X / Z, y = Y / Z^2\]
  • 无穷远点是 \(O(T, 0, 0)\), 对于任何非零 T。

  • 仿射坐标和蒙哥马利形式,P(xr, yr),其中

\[xr = x·R, yr = y·R\]
  • Lopez-Dahab 坐标和蒙哥马利形式,P(Xjr, Yjr, Zjr),其中

\[Xjr = X·R, Yjr = Y·R, Zjr = Z·R\]

蒙哥马利曲线

  • 仿射坐标,P(u)

  • 射影坐标,P(U),其中

\[u = U / Z\]
  • 无穷远点为 O(T,0),其中 T 为非零值

  • 仿射坐标与蒙哥马利形式:P(ur),其中:

\[ur = u · R\]
  • 射影坐标与蒙哥马利形式:P(Ujr),其中:

\[Ujr = U · R\]

(扭曲) Edwards 曲线

  • 仿射坐标,P(x, y)

  • 扩展齐次坐标,P(X, Y, Z, T),其中

\[x = X / Z, y = Y / Z, x·y = T / Z\]
  • 中性点 \(O(0, 1)\), 或对任意非零 Z, \(O(0, Z, Z, 0)\)

  • 仿射坐标和蒙哥马利形式,P(xr, yr),其中

\[xr = x·R, yr = y·R\]
  • 扩展齐次坐标与蒙哥马利形式,P(Xjr, Yjr, Zjr, Tjr),其中

\[Xjr = X·R, Yjr = Y·R, Zjr = Z·R, Tjr = T·R\]

存储器空间

该设备包含寄存器文件和一片本地 SRAM。两者均可通过总线直接访问,并分配有存储器映射地址空间。它们具有独立的总线接口,因此具有独立的基地址。

寄存器空间

寄存器文件的空间信息,请参阅章节 “寄存器”。

SRAM 空间

本地 SRAM 用于存储输入数据、中间数据和结果。它通过一个专用的总线接口连接到系统总线,该接口的数据宽度为字长。分配给 SRAM 的存储器空间见表3.3 SRAM 地址空间

注意: 分配的空间大小大于或等于 SRAM 的实际大小。SRAM 大小的相关信息,请参阅章节 “存储器”。

表 3.3: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 中的保留区域)

注意: 用户可以访问此区域以获取中间数据,但用户不应在此区域分配变量。

表 3.4:SRAM 中的保留区域

操作

保留地址范围 (单位:字)

OP_INV

变量:RSVD_ADDR_0 - RSVD_ADDR_2 范围:[D - 3s, D]

ECC

变量:RSVD_ADDR_0 - RSVD_ADDR_13 范围:[D - 14s, D]

其他

不适用

注
  • D = MEM_DEPTH_1。SRAM 的深度(见表存储器深度)

  • s = DATALEN.len_a + 1。一个保留变量的大小。

  • RSVD_ADDR_n 是第 n 个保留变量。其起始地址为 D - (n + 1)s,结束地址为 D - ns - 1。(0 ≤ n < 14)

参数

表3.5 为性能数据,单位 op/s 代表每秒操作次数。例如,3 op/s 表示该设备每秒能完成 3 次操作。

注意操作列。硬件操作(OP*,如 OP_MEXP、OP_kMUL 等)的数据来自 RTL 仿真。协议(如签名、验证、ECDSA 等)的数据来自运行平台,由本硬件与运行在 CPU 上的驱动软件协同工作收集。

表 3.5:性能

算法

操作

时钟周期

时钟周期

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 为硅片数据

表 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 中的寄存器偏移地址。

表 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

表 6.2:IP_VER 寄存器格式

字段

位

访问

复位值

描述

IP_VER

23:0

RO

0x010105

IP 版本号

Reserved

31:24

/

0x0

/

IP 的 GITLAB 版本寄存器

地址偏移:0x4

表 6.3:GIT_VER 寄存器格式

字段

位

访问

复位值

描述

GIT_VER

31:0

RO

0x0

Git 版本号

操作码寄存器

地址偏移:0x8

表 6.4:OPCODE 寄存器格式

字段

位

访问

复位值

描述

cmd

4:0

RW

0x0

操作码
  • 5’d1: OP_MontMult. 蒙哥马利乘法

  • 5’d2: OP_MEXP. 模幂运算

  • 5’d3: OP_MUL. 大数乘法

  • 5’d4: OP_INV. 模逆运算

  • 5’d5: OP_INV_N0. u 值的预计算

  • 5’d6: OP_MOD. 大数模运算

  • 5’d9: OP_MMAC. 大数加法/减法或线性组合

  • 5’d10: OP_kMUL. 短 Weierstrass 曲线 ECC 标量乘法

  • 5’d11: OP_GFP_PADD. GF(p) 短 Weierstrass 曲线 ECC 点加法

  • 5’d12: OP_GFP_PDBL. GF(p) 短 Weierstrass 曲线 ECC 点倍乘

  • 5’d13: OP_GF2_PADD. \(GF(2^m)\) 短 Weierstrass 曲线 ECC 点加法

  • 5’d14: OP_GF2_PDBL. \(GF(2^m)\) 短 Weierstrass 曲线 ECC 点倍乘

  • 5’d15: OP_PTC. 短 Weierstrass 曲线的坐标转换

  • 5’d16: OP_MMCURVE. 蒙哥马利曲线标量乘法

  • 5’d17: OP_ED25519kMUL. Edwards 曲线 25519 标量乘法

  • 5’d18: OP_ED448kMUL. Edwards 曲线 448 标量乘法

  • 5’d19: OP_ED25519PADD. Edwards 曲线 25519 点加法

  • 5’d20: OP_ED448PADD. Edwards 曲线 448 点加法

  • 5’d21: OP_ED_PTC. Edwards 曲线的坐标转换

  • 其他:保留

保留

31:5

/

0x0

/

MMAC 控制寄存器

地址偏移:0xC

表 6.5:MMACCTRL 寄存器格式

字段

位

访问

复位值

描述

two_term

0

RW

0x0

指示 OP_MMAC 中是 2 项还是 3 项
  • 1’b0:MMAC_3TERMS. 计算 s = ((a0 << c0) ± (a1 << c1) ± (a2 << c2)) >> c3

  • 1’b1:MMAC_2TERMS. 计算 s = ((a0 << c0) ± (a1 << c1)) >> c3

mmac_op0

1

RW

0x0

a0 和 a1 之间的操作
  • 1’b0:MMAC_SUB. 减法

  • 1’b1:MMAC_ADD. 加法

mmac_op1

2

RW

0x0

a1 和 a2 之间的操作。仅在 two_term = MMAC_3TERMS 时有效:
  • 1’b0:MMAC_SUB. 减法

  • 1’b1:MMAC_ADD. 加法

diven

3

RW

0x0

移位选项:
  • 1’b0:MMAC_LSHF_EN. 启用加数的左移

  • 1’b1:MMAC_RSHF_EN. 启用和值的右移

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

  • 在 two_term = MMAC_3TERMS 或 div_en = MMAC_RSHF_EN 时有效:

    1. 当 two_term = MMAC_3TERMS 时,为移位系数 c2 的编码。它控制 a2 的左移。合法范围是 [0, wordsize)。

    1. 当 two_term = MMAC_2TERMS 且 div_en = MMAC_RSHF_EN 时,为移位系数 c3 的编码。它控制和值的右移。合法范围是 [0, wordsize)。

保留

27:26

/

0x0

/

opa_zero

28

RW

0x0

强制置零:
  • 1’b0:MMAC_FORCE_O. 强制第一个加数 (a0) 为零。

  • 1’b1:MMAC_NOT_FORCE_O. 不强制置零

保留

31:29

/

0x0

/

控制选项寄存器

地址偏移:0x10

表 6.6:CTRLOPT 寄存器格式

字段

位

访问

复位值

描述

normalize

0

RW

0x0

蒙哥马利乘法 (OP_MontMult) 的选项
  • 1’b0:MM_MULT. 普通的 OP_MontMult

  • 1’b1: MM_EXIT. 执行 OP_MontMult,其第二个操作数为 1。用于从蒙哥马利形式退出

保留

3:1

/

0x0

/

mod_opt

4

RW

0x0

大数模运算 (OP_MOD) 的选项
  • 1’d0: MOD_NORM. 普通的 OP_MOD

  • 1’d1: MOD_SHORT_REDU. 短归约。

保留

7:5

/

0x0

/

ptc

8

RW

0x0

  • 指定结果的表示形式。这是 OP_kMUL/OP_ED25519kMUL/OP_ED448kMUL 的一个选项

  • 1’d0: C_AFF. 点为仿射坐标

  • 1’d1: C_PRJ. 点为射影坐标和蒙哥马利形式

  • 具体来说,对于 GF(p),射影坐标是雅可比坐标;对于 \(GF(2^m)\) ,是 Lopez-Dahab 坐标

保留

31:9

/

0x0

/

上下文寄存器 2

地址偏移:0x14

表 6.7:CONTEXT2 寄存器格式

字段

位

访问

复位值

描述

addr_b

10:0

RW

0x0

ECC 方程系数在 SRAM 中的地址。相关系数如下
  • 短 Weierstrass 曲线:系数 b

  • 蒙哥马利曲线:常数 a24

  • Edwards 曲线:系数 d

保留

11

/

0x0

/

addr_a

22:12

RW

0x0

ECC 方程系数在 SRAM 中的地址。相关系数如下
  • 短 Weierstrass 曲线:系数 a

保留

31:23

/

0x0

/

上下文寄存器 0

地址偏移:0x18

表 6.8:CONTEXTO 寄存器格式

字段

位

访问

复位值

描述

addr_n

10:0

RW

0x0

N 的地址
  • 对于 GF(p) 是模数 p

  • 对于 \(GF(2^m)\) 是域多项式

保留

11

/

0x0

/

addr_r2

22:12

RW

0x0

R2 的地址,需要此值的计算将从此处获取它

保留

23

/

0x0

/

field

24

RW

0x0

指定操作的底层域
  • 1’d0: FIELD_GF2, \(GF(2^m)\)

  • 1’d1: FIELD_GFP, GF(p)

保留

31:25

/

0x0

/

变量地址寄存器 0

地址偏移:0x1C

表 6.9:VARADDR0 寄存器格式

字段

位

访问

复位值

描述

addr1

10:0

RW

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_MontMult:操作数 a

  • OP_MEXP:指数

  • OP_MUL:操作数 a

  • OP_MMAC:操作数 a0

  • OP_MOD:操作数 a (r = a mod b)

  • OP_INV:操作数 x

  • OP_kMUL:输入点 G(x,y) 的 x 坐标,也是结果 R(x,y) 的 x 坐标

  • OP_GFP_PADD/OP_GF2_PADD:第一个输入点 P(x,y,z) 的 x 坐标,也是结果 R(x,y,z) 的 x 坐标

  • OP_GFP_PDBL/OP_GF2_PDBL:输入点 P(x,y,z) 的 x 坐标

  • OP_PTC:输入点 P(x,y,z) 的 x 坐标,也是结果 R(x,y) 的 x 坐标

  • OP_MMCURVE:输入点 G(u,v) 的 u 坐标,也是结果 R(u,v) 的 u 坐标

  • OP_ED25519kMUL/OP_ED448kMUL:输入点 P(x,y,z) 的 x 坐标,也是结果 R(x,y) 的 x 坐标

  • OP_ED25519PADD/OP_ED448PADD:第一个输入点 P(x,y,z,t) 的 x 坐标,也是结果 R(x,y) 的 x 坐标

  • OP_ED_PTC:输入点 P(x,y,z) 的 x 坐标,也是结果 R(x,y) 的 x 坐标

保留

11

/

0x0

/

addr2

22:12

RW

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_MontMult:操作数 b

  • OP_MEXP:底数

  • OP_MUL:操作数 b

  • OP_MMAC:操作数 a1

  • OP_MOD:模数

  • OP_INV:操作数 y

  • OP_kMUL:输入点 G(x,y) 的 y 坐标,也是结果 R(x,y) 的 y 坐标

  • OP_GFP_PADD/OP_GF2_PADD:第一个输入点 P(x,y,z) 的 y 坐标,也是结果 R(x,y,z) 的 y 坐标

  • OP_GFP_PDBL/OP_GF2_PDBL:输入点 P(x,y,z) 的 y 坐标

  • OP_PTC:输入点 P(x,y,z) 的 y 坐标,也是结果 R(x,y) 的 y 坐标

  • OP_MMCURVE:x2 (仅限硬件内部使用。 (x2, z2) 的 u 坐标)

  • OP_ED25519kMUL/OP_ED448kMUL:输入点 P(x,y,z) 的 y 坐标,也是结果 R(x,y) 的 y 坐标

  • OP_ED25519PADD/OP_ED448PADD:第一个输入点 P(x,y,z,t) 的 y 坐标,也是结果 R(x,y) 的 y 坐标

  • OP_ED_PTC:输入点 P(x,y,z) 的 y 坐标,也是结果 R(x,y) 的 y 坐标

保留

31:23

/

0x0

/

变量地址寄存器 1

地址偏移:0x20

表 6.10:VARADDR1 寄存器格式

字段

位

访问

复位值

描述

addr3

10:0

RW

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_MontMult:结果

  • OP_MEXP:结果

  • OP_MUL:结果

  • OP_MMAC:结果

  • OP_INV:结果 a = x^{-1} mod y

  • OP_kMUL:z 坐标 (仅限硬件内部使用)

  • OP_GFP_PADD/OP_GF2_PADD:第一个输入点 P(x,y,z) 的 z 坐标,也是结果 R(x,y,z) 的 z 坐标

  • OP_GFP_PDBL/OP_GF2_PDBL:输入点 P(x,y,z) 的 z 坐标

  • OP_PTC:输入点 P(x,y,z) 的 z 坐标

  • OP_ED25519kMUL/OP_ED448kMUL:输入点 P(x,y,z) 的 z 坐标

  • OP_ED25519PADD/OP_ED448PADD:第一个输入点 P(x,y,z,t) 的 z 坐标

  • OP_ED_PTC:输入点 P(x,y,z) 的 z 坐标

保留

11

/

0x0

/

addr4

22:12

RW

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_MMAC:操作数 a2

  • OP_INV:结果 b = y^{-1} mod x

  • OP_GFP_PADD/OP_GF2_PADD:第二个输入点 Q(x,y,z) 的 x 坐标

  • OP_GFP_PDBL/OP_GF2_PDBL:结果 R(x,y,z) 的 x 坐标

  • OP_ED25519PADD/OP_ED448PADD:第二个输入点 Q(x,y,z,t) 的 x 坐标

保留

31:23

/

0x0

/

变量地址寄存器 2

地址偏移:0x24

表 6.11:VARADDR2 寄存器格式

字段

位

访问

复位值

描述

addr5

10:0

RW

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_INV:操作数 A。用户需要将其初始化为大数 1。

  • OP_GFP_PADD/OP_GF2_PADD:第二个输入点 Q(x,y,z) 的 y 坐标

  • OP_GFP_PDBL/OP_GF2_PDBL:结果 R(x,y,z) 的 y 坐标

  • OP_ED25519PADD/OP_ED448PADD:第二个输入点 Q(x,y,z,t) 的 y 坐标

保留

11

/

0x0

/

addr6

22:12

RW

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_INV:结果 v

  • OP_GFP_PDBL/OP_GF2_PDBL:结果 R(x,y,z) 的 z 坐标

  • OP_MMCURVE:z3 (仅限硬件内部使用。 (x3, z3) 的 z 坐标)

  • OP_ED25519PADD/OP_ED448PADD:第二个输入点 Q(x,y,z,t) 的 z 坐标

保留

31:23

/

0x0

/

密钥寄存器

地址偏移:0x28

表 6.12:KEYT 寄存器格式

字段

位

访问

复位值

描述

k_t1

10:0

WO

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_kMUL/OP_MMCURVE/OP_ED25519kMUL/OP_ED448kMUL:标量 k

  • OP_ED25519PADD/OP_ED448PADD:第一个输入点 P(x,y,z,t) 的 t 坐标

保留

11

/

0x0

/

t2

22:12

RW

0x0

变量在 SRAM 中的地址。相关变量如下
  • OP_ED25519PADD/OP_ED448PADD:第二个输入点 Q(x,y,z,t) 的 t 坐标

保留

31:23

/

0x0

/

数据长度寄存器

地址偏移:0x2C

表 6.13:DATALEN 寄存器格式

字段

位

访问

复位值

描述

len_a

9:0

RW

0x0

    1. 上下文 n_wlen。(单位:字) 对于除 (2) 所列之外的操作,它指定操作所处理的所有数据的公共长度

  • 对于 GF(p),设置 len_a = n_wlen - 1

  • 对于 \(GF(2^m)\) ,设置 len_a = n_wlen

  • SRAM 中大数的实际长度是 n_wlen, 例如:

    • 字长=32,GF(p) ECC 曲线 NIST P-256。设置 len_a = ceiling(256/32) + 1 - 1 = 8,则 SRAM 中变量的字长为 9。

    • 字长=32, \(GF(2^m)\) ECC 曲线 NIST B-163。设置 len_a = ceiling(163/32) = 6,则 SRAM 中变量的字长为 6。

    1. SRAM 中变量(大数)的长度。(单位:字)

    • 相关变量: OP_MUL 的操作数 a

    • 对于 GF(p),SRAM 中大数的实际长度是 (len_a+1)

    • 对于 \(GF(2^m)\) ,SRAM 中大数的实际长度是 len_a

保留

11:10

/

0x0

/

len_b

21:12

RW

0x0

变量在 SRAM 中的长度。相关变量如下
  • OP_MUL:操作数 b

  • OP_MOD:操作数 a (r=a mod b)

保留

31:22

/

0x0

/

密钥大小寄存

地址偏移:0x30

表 6.14:KEYSIZE 寄存器格式

字段

位

访问

复位值

描述

ecc_rsa

13:0

RW

0x0

密钥大小或标量大小。(单位:位)
  • OP_MEXP:指数大小

  • OP_kMUL/OP_MMCURVE/OP_ED25519kMUL/OP_ED448kMUL:标量大小

保留

31:14

/

0x0

/

获取 U 寄存器 L

地址偏移:0x34

表 6.15:GET_U_L 寄存器格式

字段

位

访问

复位值

描述

ul

31:0

RW

0x0

u 的低 32 位

获取 U 寄存器 H

地址偏移:0x38

表 6.16:GET_U_H 寄存器格式

字段

位

访问

复位值

描述

uh

31:0

RW

0x0

u 的高 32 位。当字长为 64 位时有效。

中断状态寄存器

地址偏移:0x3C

表 6.17:INTST 寄存器格式

字段

位

访问

复位值

描述

int_sta

0

W1C

0x0

中断状态。写 1 清除

保留

31:1

/

0x0

/

中断使能寄存器

地址偏移:0x40

表 6.18:INTEN 寄存器格式

字段

位

访问

复位值

描述

int_en

0

RW

0x0

中断使能
  • 1’b0:禁用中断

  • 1’b1:使能中断

保留

31:1

/

0x0

/

内部变量大小寄存器

地址偏移:0x44

表 6.19:VARSIZE 寄存器格式

字段

位

访问

复位值

描述

var_size

9:0

RW

0x0

SRAM 保留区域中每个变量的大小。(单位:字)。var_size >= n_wlen。推荐值如下
  • 当字长=32,ECC 571,值为 19

  • 当字长=64,ECC 571,值为 10

  • 当字长=32,RSA8192,值为 257

  • 当字长=64,RSA8192,值为 129

保留

31:10

/

0x0

/

模逆移位计数寄存器

地址偏移:0x48

表 6.20:INVSHFCNT 寄存器格式

字段

位

访问

复位值

描述

gent

12:0

RO

0x0

最大公约数 (GCD) 的移位计数。OP_INV:结果 g

保留

31:13

/

0x0

/

上下文寄存器 1

地址偏移:0x4C

表 6.21: CONTEXT1 寄存器格式

字段

位

访问

复位值

描述

n_m2

10:0

RW

0x0

变量在 SRAM 中的地址。OP_kMUL/OP_PTC/OP_MMCURVE/OP_ED25519kMUL/OP_ED448kMUL/OP_ED_PTC:
  • 对于 GF(p) 是 (p-2),

  • 对于 \(GF(2^m)\) 是 (2^m - 2)。

保留

31:13

/

0x0

/