.. _ip_ls_intf_acryp: ACRYP ========= 1. 简介 >>>>>>> 芯来非对称密码加速器 (ACRYP) 适用于嵌入式应用。它具备基本算术运算和常用的密码学操作的能力。配合驱动程序,它可以灵活地支持流行的上层应用。 2. 主要特性 >>>>>>>>>>> 本设备的主要特性如下: * RSA - RSA 密钥长度最大支持 8192 位 - RSA 密钥对生成 * ECC (包括 SM2) - GF(p) 和 :math:`GF(2^m)` 域上的 ECC 曲线 - GF(p) 域上 ECC 密钥长度最大支持 521 位 - :math:`GF(2^m)` 域上 ECC 密钥长度最大支持 571 位 - 支持短 Weierstrass 曲线和 Koblitz 曲线,包括来自标准 NIST、brainpool、SEC 2 和 SM2 的曲线 - 蒙哥马利曲线 25519/448 - (扭) 爱德华兹曲线 25519/448 * 能力 - 大数算术运算 - 非对称密码学操作 - 支持 GF(p) 和 :math:`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 :math:`µm^2` 3. 功能描述 >>>>>>>>>>> 符号与约定 ---------------- 符号 ~~~~~~~~~~~~~~~~~~~~ 本文档使用的记号如下: * ACRYP:非对称密码加速器 * {a}_blen:变量 a 的大数位长度 * {a}_wlen:变量 a 在实现中的大数字长度 * alg_blen:算法的大数位长度 * alg_blen(.):确定 alg_blen 的函数。对于 GF(p),等于 eff_blen(.);对于 :math:`GF(2^{m})`,等于 deg(.) * deg(.) 多项式的次数 * eff_blen(.):无符号数或多项式的有效位长度,不包括前导零 * :math:`GF(2^{m})`:次数为 m 的扩展二元域 * GF(p):素数阶 p 的有限域 * LSB:数字的最低有效位 * LSW:数字的最低有效字 * Mont(.):蒙哥马利变换。将数字转换为蒙哥马利形式,Mont(a) = MontMult(a, R2) * MontMult(A, B), MM(A, B):蒙哥马利乘法。:math:`MontMult(A, B) = ABR^{-1} \mod N` * MSB:数字的最高有效位 * MSW:数字的最高有效字 * MSW_m1:MSW 的下一个字。如果一个数字只有一个字,则 MSW_m1 和 MSW 指向同一个字 * N, P:通常它们是模数 * n_wlen:实现中大数的字长度 * R:蒙哥马利乘法的重要参数。对于 GF(p), :math:`R = 2^{n\_wlen \cdot w}`; 对于 :math:`GF(2^{m})`,:math:`R = x^{n\_wlen \cdot w}` * R2::math:`R2 = RR \mod N` * RR:RR = R·R * u, μ:对于 GF(p),:math:`μ = -N_0^{-1} \mod 2^{w}`; 对于 :math:`GF(2^{m})`,:math:`μ = -N_0^{-1} \mod x^{w}`,:math:`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,在 :math:`GF(2^{m})` 中设置为 3。 长度与算法 ^^^^^^^^^^^^^^^^^^^^ 这里有两种数据长度。它们是不同的。 * alg_blen,算法的大数长度(单位:位) 理论上,每个算法都有一个固有的数字长度。所有完全约减后的数据都可以用此长度的非负整数表示。例如,使用 ECC 曲线 NIST P-256 的 ECDSA,其长度为 256 位 * n_wlen,实现的大数长度(单位:字) 实现建立在软件和硬件之上。此长度表示实现算法所用的大数长度。它反映了实现的一个能力——支持算法的程度。例如,使用约 256 位大数长度的实现可以支持 NIST P-256 或更低,但不能支持 NIST P-521。在实现内部,一个完整的数字由 n_wlen 个连续的字组成。几乎所有的内部数字都是这个长度,包括输入、中间数据和结果 长度设置影响性能。数字按字处理。更长的长度支持更大的范围(例如,密钥大小),但需要更多的计算时间。适当的长度可以使计算时间受益,而超出需要的长度将导致更多的计算时间。因此,数据长度是与操作或实现相关联的属性。 这是一个重要参数。许多配置都依赖于它。它在整个文档中使用。 区分这两种长度很重要。例如,一个日历计数的应用程序计算年、月和日。所有数字都小于 :math:`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] 表示数字 :math:`-b[b\_blen]2^{b\_blen} + \sum_{i=0}^{b\_blen-1} b[i] \times 2^i` * 在 GF(p) 中的无符号数 它以普通的二进制形式表示。没有符号位。变量 b[b_blen-1:0] 表示数字 :math:`\sum_{i=0}^{b\_blen-1} b[i] \times 2^i` * 在 :math:`GF(2^{m})` 中的多项式。 它表示为多项式系数的二进制数组。变量 b[b_blen-1:0] 表示多项式 :math:`\sum_{i=0}^{b\_blen-1} b[i] \times x^i`。为了简洁并与 GF(p) 的写法统一,符号 x 可能被替换为'2',这也是一个符号,不是整数。 框图 ---------------- 这里是本设备的框图: .. _ACRYP 框图: .. figure:: /assets/images/acryp_block.png :alt: ACRYP 框图 :align: center **图 3.1: ACRYP 框图** 它包含以下组件: * Bus inf0:总线接口 0。CPU 通过它访问寄存器文件。总线宽度为 32 位 * Bus inf1:总线接口 1。CPU 通过它访问本地 SRAM,写入数据和读取结果。总线宽度为字大小 * 寄存器文件:配置和状态寄存器的集合。它是本设备的编程接口。本设备的功能通过此寄存器文件对用户开放。 * 中断:向 CPU 发出的中断。 * SRAM:本地 SRAM。可从总线访问。在计算期间也由内部逻辑使用。计算期间涉及的所有大数都存储在此处,包括输入数据、结果和中间数据。 * 核心:负责各种计算的算法核心。 以下是关于系统及其工作原理的简单描述。 本设备提供一组操作,包括基本操作和复合操作。这些操作通过寄存器文件对用户开放。算法可以通过一系列操作来实现。在此设备中处理的数据是大数并存储在本地 SRAM 中。(关于大数格式的更多详情,请参阅 “数据格式” 章节。本设备支持双域, GF(p) 和 :math:`GF(2^{m})`。 使用的基本步骤如下。 1. 用户有一个要执行的操作。 2. 将输入数据写入 SRAM。 3. 根据操作要求配置寄存器文件。然后开始计算。 4. 通过轮询或中断等待操作完成。 5. 从 SRAM 读取结果。 算术运算 ------------------- 本设备的功能涉及大数算术和模算术。这种算术通常是计算密集型的,数据流量非常小。硬件加速可以大大减轻 CPU 的负担。该硬件能够处理非对称加密中常用的一些基本算术和复合操作(表3.1 硬件支持的算术运算)。有关每种算术和操作的更多详情,请参阅 “流程” 章节。 .. list-table:: 表 3.1:硬件支持的算术运算 :widths: 20 25 40 10 :header-rows: 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 - * - 模逆 - :math:`y = x^{-1} \mod N` - 给定x, N, 求 y - * - 蒙哥马利模乘相关算术 - - - * - INV_N0 - :math:`μ = -N_0^{-1} \mod 2^w` - 给定 :math:`N\_0`, 求 μ - 辅助 * - 蒙哥马利乘法 - :math:`C = ABR^{-1} \mod N` - 给定 :math:`A, B, N, R = 2^{n\_wlen \cdot w}`, 求 C - * - RSA 相关算术 - - - * - 模幂运算 - :math:`c = m^{e} \mod N` - 给定m, e, N, 求 c - * - ECC 相关算术 - - - * - 点加 - :math:`R(x, y) = P(x, y) + Q(x, y)` - 给定点 P 和 Q, 求 R - * - 倍点 - :math:`R(x, y) = 2 * P(x, y)` - 给定点 P, 求 R - * - 标量乘法 - :math:`R(x, y) = k * G(x, y)` - 给定点 G, 求 R - * - 坐标变换 - :math:`R(x, y) = PTC(P(x, y, z))` - 将射影坐标和蒙哥马利形式的点 P 变换为仿射坐标的点 R - 并非所有类型的流行算术都仅由硬件支持。有些可以通过驱动和硬件的组合实现(需要多次硬件操作) .. list-table:: 表 3.2:驱动与硬件组合支持的算术运算 :widths: 20 25 40 10 :header-rows: 1 * - 算术运算 - 公式 - 描述 - 注释 * - 基本算术运算 - - - * - 模加法 - s = a + b mod N - 给定a, b, N, 求 s - * - 模乘法 - c = a·b mod N - 给定a, b, N, 求 c - * - RRmodN - :math:`R2 = R^{2} \mod N` - 给定 :math:`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) .. math:: n\_wlen = \left\lceil \frac{alg\_blen + 32}{wordsize} \right\rceil * :math:`GF(2^{m})` .. math:: 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 * :math:`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/.… * :math:`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, :math:`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 长度扩展与字节序: .. figure:: /assets/images/acryp_byte_sequence.png :alt: ACRYP 长度扩展与字节序 :align: center **图 3.2: 长度扩展与字节序** 坐标 ------------------- 以下是各种曲线中使用的坐标 GF(p) 短 Weierstrass 曲线 * 仿射坐标,P(x, y) * Jacobian 坐标,P(X, Y, Z),其中 .. math:: x = X / Z^2, y = Y / Z^3 * 无穷远点是 :math:`O(T^2, T^3, 0)`, 对于任何非零 T。 * 仿射坐标和蒙哥马利形式,P(xr, yr),其中 .. math:: xr = x·R, yr = y·R * Jacobian 坐标和蒙哥马利形式,P(Xjr, Yjr, Zjr),其中 .. math:: Xjr = X·R, Yjr = Y·R, Zjr = Z·R :math:`GF(2^{m})` 短 Weierstrass 曲线 * 仿射坐标,P(x, y) * Lopez-Dahab 坐标,P(X, Y, Z),其中 .. math:: x = X / Z, y = Y / Z^2 * 无穷远点是 :math:`O(T, 0, 0)`, 对于任何非零 T。 * 仿射坐标和蒙哥马利形式,P(xr, yr),其中 .. math:: xr = x·R, yr = y·R * Lopez-Dahab 坐标和蒙哥马利形式,P(Xjr, Yjr, Zjr),其中 .. math:: Xjr = X·R, Yjr = Y·R, Zjr = Z·R 蒙哥马利曲线 * 仿射坐标,P(u) * 射影坐标,P(U),其中 .. math:: u = U / Z * 无穷远点为 O(T,0),其中 T 为非零值 * 仿射坐标与蒙哥马利形式:P(ur),其中: .. math:: ur = u · R * 射影坐标与蒙哥马利形式:P(Ujr),其中: .. math:: Ujr = U · R (扭曲) Edwards 曲线 * 仿射坐标,P(x, y) * 扩展齐次坐标,P(X, Y, Z, T),其中 .. math:: x = X / Z, y = Y / Z, x·y = T / Z * 中性点 :math:`O(0, 1)`, 或对任意非零 Z, :math:`O(0, Z, Z, 0)` * 仿射坐标和蒙哥马利形式,P(xr, yr),其中 .. math:: xr = x·R, yr = y·R * 扩展齐次坐标与蒙哥马利形式,P(Xjr, Yjr, Zjr, Tjr),其中 .. math:: Xjr = X·R, Yjr = Y·R, Zjr = Z·R, Tjr = T·R 存储器空间 --------------------- 该设备包含寄存器文件和一片本地 SRAM。两者均可通过总线直接访问,并分配有存储器映射地址空间。它们具有独立的总线接口,因此具有独立的基地址。 寄存器空间 ~~~~~~~~~~~~~~~~~~~~ 寄存器文件的空间信息,请参阅章节 “寄存器”。 SRAM 空间 ~~~~~~~~~~~~~~~~~~~~ 本地 SRAM 用于存储输入数据、中间数据和结果。它通过一个专用的总线接口连接到系统总线,该接口的数据宽度为字长。分配给 SRAM 的存储器空间见表3.3 SRAM 地址空间 注意: 分配的空间大小大于或等于 SRAM 的实际大小。SRAM 大小的相关信息,请参阅章节 “存储器”。 .. list-table:: 表 3.3:SRAM 地址空间 :widths: 20 20 15 15 15 40 :header-rows: 1 * - 地址 (字长=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 中的保留区域) 注意: 用户可以访问此区域以获取中间数据,但用户不应在此区域分配变量。 .. list-table:: 表 3.4:SRAM 中的保留区域 :widths: 15 50 :header-rows: 1 * - 操作 - 保留地址范围 (单位:字) * - 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 上的驱动软件协同工作收集。 .. list-table:: 表 3.5:性能 :widths: 30 30 25 25 25 25 :header-rows: 1 * - 算法 - 操作 - 时钟周期 - 时钟周期 - 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 - * - :math:`GF(2^{m})` ECC 163 - OP_kMUL - 175k - 113k - 572 - 892 * - :math:`GF(2^{m})` ECC 163 - ECDSA - Sign - - - - * - :math:`GF(2^{m})` ECC 163 - ECDSA - Verify - - - - * - :math:`GF(2^{m})` ECC 233 - OP_kMUL - 315k - 173k - 318 - 579 * - :math:`GF(2^{m})` ECC 233 - ECDSA - Sign - - - - * - :math:`GF(2^{m})` ECC 233 - ECDSA - Verify - - - - * - :math:`GF(2^{m})` ECC 283 - OP_kMUL - 478k - 289k - 209 - 346 * - :math:`GF(2^{m})` ECC 283 - ECDSA - Sign - - - - * - :math:`GF(2^{m})` ECC 283 - ECDSA - Verify - - - - * - :math:`GF(2^{m})` ECC 409 - OP_kMUL - 1149k - 554k - 87 - 180 * - :math:`GF(2^{m})` ECC 409 - ECDSA - Sign - - - - * - :math:`GF(2^{m})` ECC 409 - ECDSA - Verify - - - - * - :math:`GF(2^{m})` ECC 571 - OP_kMUL - 2534k - 964k - 39 - 103 * - :math:`GF(2^{m})` ECC 571 - ECDSA - Sign - - - - * - :math:`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 为硅片数据 .. list-table:: 表 3.6:硅片数据 :widths: 25 25 25 25 25 25 25 25 25 25 25 25 :header-rows: 1 * - 工艺 - 字 - 频率 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 中的寄存器偏移地址。 .. list-table:: 表 6.1:ACRYP_RF 中的寄存器偏移地址 :widths: 10 25 46 :header-rows: 1 * - 偏移量 - 寄存器名称 - 功能描述 * - 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`` .. list-table:: 表 6.2:IP_VER 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - IP_VER - 23:0 - RO - 0x010105 - IP 版本号 * - Reserved - 31:24 - / - 0x0 - / IP 的 GITLAB 版本寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x4`` .. list-table:: 表 6.3:GIT_VER 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - GIT_VER - 31:0 - RO - 0x0 - Git 版本号 操作码寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x8`` .. list-table:: 表 6.4:OPCODE 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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. :math:`GF(2^m)` 短 Weierstrass 曲线 ECC 点加法 - 5'd14: OP_GF2_PDBL. :math:`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`` .. list-table:: 表 6.5:MMACCTRL 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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)。 - (2) 当 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`` .. list-table:: 表 6.6:CTRLOPT 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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),射影坐标是雅可比坐标;对于 :math:`GF(2^m)` ,是 Lopez-Dahab 坐标 * - 保留 - 31:9 - / - 0x0 - / 上下文寄存器 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x14`` .. list-table:: 表 6.7:CONTEXT2 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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`` .. list-table:: 表 6.8:CONTEXTO 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - addr_n - 10:0 - RW - 0x0 - N 的地址 - 对于 GF(p) 是模数 p - 对于 :math:`GF(2^m)` 是域多项式 * - 保留 - 11 - / - 0x0 - / * - addr_r2 - 22:12 - RW - 0x0 - R2 的地址,需要此值的计算将从此处获取它 * - 保留 - 23 - / - 0x0 - / * - field - 24 - RW - 0x0 - 指定操作的底层域 - 1'd0: FIELD_GF2, :math:`GF(2^m)` - 1'd1: FIELD_GFP, GF(p) * - 保留 - 31:25 - / - 0x0 - / 变量地址寄存器 0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x1C`` .. list-table:: 表 6.9:VARADDR0 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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`` .. list-table:: 表 6.10:VARADDR1 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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`` .. list-table:: 表 6.11:VARADDR2 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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`` .. list-table:: 表 6.12:KEYT 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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`` .. list-table:: 表 6.13:DATALEN 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - len_a - 9:0 - RW - 0x0 - - (1) 上下文 n_wlen。(单位:字) 对于除 (2) 所列之外的操作,它指定操作所处理的所有数据的公共长度 - 对于 GF(p),设置 len_a = n_wlen - 1 - 对于 :math:`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, :math:`GF(2^m)` ECC 曲线 NIST B-163。设置 len_a = ceiling(163/32) = 6,则 SRAM 中变量的字长为 6。 - (2) SRAM 中变量(大数)的长度。(单位:字) - 相关变量: OP_MUL 的操作数 a - 对于 GF(p),SRAM 中大数的实际长度是 (len_a+1) - 对于 :math:`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`` .. list-table:: 表 6.14:KEYSIZE 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ecc_rsa - 13:0 - RW - 0x0 - 密钥大小或标量大小。(单位:位) - OP_MEXP:指数大小 - OP_kMUL/OP_MMCURVE/OP_ED25519kMUL/OP_ED448kMUL:标量大小 * - 保留 - 31:14 - / - 0x0 - / 获取 U 寄存器 L ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x34`` .. list-table:: 表 6.15:GET_U_L 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ul - 31:0 - RW - 0x0 - u 的低 32 位 获取 U 寄存器 H ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x38`` .. list-table:: 表 6.16:GET_U_H 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - uh - 31:0 - RW - 0x0 - u 的高 32 位。当字长为 64 位时有效。 中断状态寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x3C`` .. list-table:: 表 6.17:INTST 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - int_sta - 0 - W1C - 0x0 - 中断状态。写 1 清除 * - 保留 - 31:1 - / - 0x0 - / 中断使能寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x40`` .. list-table:: 表 6.18:INTEN 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - int_en - 0 - RW - 0x0 - 中断使能 - 1'b0:禁用中断 - 1'b1:使能中断 * - 保留 - 31:1 - / - 0x0 - / 内部变量大小寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x44`` .. list-table:: 表 6.19:VARSIZE 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 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`` .. list-table:: 表 6.20:INVSHFCNT 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - gent - 12:0 - RO - 0x0 - 最大公约数 (GCD) 的移位计数。OP_INV:结果 g * - 保留 - 31:13 - / - 0x0 - / 上下文寄存器 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x4C`` .. list-table:: 表 6.21: CONTEXT1 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - n_m2 - 10:0 - RW - 0x0 - 变量在 SRAM 中的地址。OP_kMUL/OP_PTC/OP_MMCURVE/OP_ED25519kMUL/OP_ED448kMUL/OP_ED_PTC: - 对于 GF(p) 是 (p-2), - 对于 :math:`GF(2^m)` 是 (2^m - 2)。 * - 保留 - 31:13 - / - 0x0 - /