.. _ip_ls_intf_cryp: CRYP ========= 1. 简介 >>>>>>> 加密处理器(CRYP)可使用 DES、三重 DES、AES 或 SM4 算法进行加密和解密数据。它完全符合以下标准的实现: * 美国联邦信息处理标准出版物(FIPS PUB 46-3,1999年10月)和美国国家标准学会(ANSI X9.52)定义的数据加密标准(DES)和三重 DES(TDES)。 * 美国联邦信息处理标准出版物(FIPS PUB 197,2001年11月)定义的高级加密标准(AES)。 * SM4 加密标准 GB/T 32907-2016。 支持多种密钥大小和链式模式: * DES/TDES 链式模式 ECB 和 CBC,支持标准的 56 位密钥,每个密钥带 8 位奇偶校验位。 * SM4 链式模式 ECB、CBC、CTR、GCM、GMAC、CCM,密钥大小为 128 位。 * AES 链式模式 ECB、CBC、CTR、GCM、GMAC、CCM,密钥大小为 128、192 或 256 位 CRYP 是一个 32 位总线外设。它支持传入和传出数据的 DMA 传输(需要两个 DMA 通道)。该外设还包括输入和输出 FIFO(每个深度为 8 个字)以提高性能。 2. 主要特性 >>>>>>>>>>> 加密处理器的主要特性如下: * 符合以下标准的实现: - NIST FIPS 出版物 46-3,数据加密标准(DES) - ANSI X9.52,三重数据加密算法操作模式 - NIST FIPS 出版物 197,高级加密标准(AES) * AES 对称块密码实现 - 128 位数据块处理 - 支持 128、192 和 256 位密钥长度 - 支持多种链式模式的加密和解密:电子密码本(ECB)、密码块链接(CBC)、计数器模式(CTR)、Galois 计数器模式(GCM)、Galois 消息验证码模式(GMAC)和带 CBC-MAC 的计数器模式(CCM) - 在 AES-ECB 模式下,使用 128 位(256 位)密钥处理一个 128 位数据块需要 11(15)个时钟周期 - 集成密钥调度器及其密钥派生阶段(仅 ECB 或 CBC 解密) * SM4 对称块密码实现 - 128 位数据块处理 - 支持 128 位密钥长度 - 支持多种链式模式的加密和解密:电子密码本(ECB)、密码块链接(CBC)、计数器模式(CTR)、Galois 计数器模式(GCM)、Galois 消息验证码模式(GMAC)和带 CBC-MAC 的计数器模式(CCM) - 在 SM4-ECB 模式下,使用 128 位密钥处理一个 128 位数据块需要 33 个时钟周期 - 集成密钥调度器及其密钥派生阶段(仅 ECB 或 CBC 解密) * DES/TDES 加密/解密实现 - 64 位数据块处理 - 支持 64、128 和 192 位密钥长度 - 支持 ECB 和 CBC 链式模式的加密和解密 - 直接实现简单 DES 算法(使用单个密钥 K1) - 在 DES(TDES)ECB 模式下处理一个 64 位数据块需要 17(51)个时钟周期 - 密文窃取的软件实现 * DES/TDES AES 和 SM4 的共同特性 - 总线从设备外设,仅可通过 32 位字单次访问 - 256 位寄存器用于存储加密密钥(8 个 32 位寄存器) - 128 位寄存器用于存储初始化向量(4 个 32 位寄存器) - 一个内部输入 FIFO,包含八个 32 位字,对应四个传入的 DES 块或两个 AES 块 - 一个内部输出 FIFO,包含八个 32 位字,对应四个处理后的 DES 块或两个 AES 块 - 支持使用一个通道的直接内存访问(DMA)的自动数据流控制,支持 4 字突发传输 - 数据交换逻辑,支持 1、8、16 或 32 位数据 - 如果加密处理器需要处理具有更高优先级的另一条消息(挂起/恢复操作),软件可以暂停当前消息 - 一个内部输入 FIFO - FIFO 的宽度为 32 位 - FIFO 的深度为 8 - 一个内部输出 FIFO - FIFO 的宽度为 32 位 - FIFO 的深度为 8 - 支持来自 efuse/otp 的 768 位多组密钥 - 6 组 128 位密钥 - 4 组 192 位密钥 - 3 组 256 位密钥 3. 功能描述 >>>>>>>>>>> CRYP 模块框图 ---------------- 图 3.1 为加密处理器的模块框图。 .. _CRYP 模块框图: .. figure:: /assets/images/cryp_block.png :alt: CRYP 模块框图 :align: center **图 3.1: CRYP 模块框图** CRYP DES/TDES 加密核心 ---------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~ DES/三重 DES 加密核心由三个部分组成: * DES 算法(DES 核心) * 多个密钥(DES 算法一个,TDES 算法一至三个) * 初始化向量,仅在 CBC 模式下使用 DES/三重 DES 加密核心提供两种操作模式: * ALGODIR=0:使用存储在 CRYP_Kx 寄存器中的密钥进行明文加密。 * ALGODIR=1:使用存储在 CRYP_Kx 寄存器中的密钥进行密文解密。 操作模式通过编程 CRYP_CR 寄存器中的 ALGODIR 位来选择。 典型数据处理 ~~~~~~~~~~~~~~~~~~~~ DES 模式下加密处理器的典型用法可在第 *“CRYP DES/TDES 基本链式模式(ECB, CBC)”* 节中找到。 注意: 中间 DES 阶段的输出永远不会在加密边界之外暴露,除了 CBC 模式下的 IV 寄存器。 DES 密钥设置和链式模式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TDES 允许三种不同的密钥选项: * 三个独立密钥 第一个选项指定所有密钥都是独立的,即 K1、K2 和 K3 是独立的。FIPS PUB 46-3 - 1999(以及 ANSI X9.52 - 1998)将此选项称为密钥选项 1,并将 TDES 称为 3-key TDES。 * 两个独立密钥 第二个选项指定 K1 和 K2 是独立的,且 K3 等于 K1,即 K1 和 K2 是独立的,K3 = K1。FIPS PUB 46-3 - 1999(以及 ANSI X9.52 - 1998)将此第二选项称为密钥选项 2,并将 TDES 称为 2-key TDES。 * 三个相同密钥 第三个选项指定 K1、K2 和 K3 相等,即 K1 = K2 = K3 FIPS PUB 46-3 - 1999(以及 ANSI X9.52 - 1998)将第三个选项称为密钥选项 3。这种“1-key”TDES 等效于单 DES。 DES 硬件支持以下链式算法,可通过 CRYP_CR 寄存器中的 ALGOMODE 位选择: * 电子密码本(ECB) * 密码块链接(CBC) 这些模式在第 *“CRYP DES/TDES 基本链式模式(ECB, CBC)”* 节中有详细描述。 CRYP AES/SM4 加密核心 ---------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~ AES/SM4 加密核心由以下部分组成: * AES/SM4 算法(AES/SM4 核心) * 二进制 Galois 域上的乘法器(GF2muI) * 密钥信息 * 初始化向量(IV)或 Nonce 信息 * 链式算法逻辑(XOR、反馈/计数器、掩码) AES 核心处理 128 位数据块(四个字),密钥长度为 128、192 或 256 位。根据链式模式,外设需要零个或一个 128 位初始化向量(IV)。 SM4 核心处理 128 位数据块(四个字),密钥长度为 128 位。根据链式模式,外设需要零个或一个 128 位初始化向量(IV)。 加密外设有两种操作模式: * ALGODIR=0:使用存储在 CRYP_Kx 寄存器中的密钥进行明文加密。 * ALGODIR=1:使用存储在 CRYP_Kx 寄存器中的密钥进行密文解密。 当选择 ECB 和 CBC 链式模式时,加密外设会自动执行初始密钥派生过程。 操作模式通过编程 CRYP_CR 寄存器中的 ALGODIR 位来选择。 典型数据处理 ~~~~~~~~~~~~~~~~~~~~ AES/SM4 模式下加密处理器典型用法的描述可在第 *“CRYP AES/SM4 基本链式模式(ECB, CBC)”* 节中找到。 注意: 中间 AES/SM4 阶段的输出永远不会在加密边界之外暴露,除了 IV 寄存器。 AES/SM4 链式模式 ~~~~~~~~~~~~~~~~~~~~ 加密处理器支持以下链式算法,可通过 CRYP_CR 寄存器中的 ALGOMODE 位选择: * 电子密码本(ECB) * 密码块链接(CBC) * 计数器模式(CTR) * Galois/计数器模式(GCM) * Galois 消息验证码模式(GMAC) * 带 CBC-MAC 的计数器模式(CCM) 以下小节中对这些链式模式进行了简要介绍。 详细说明,请参阅第 *“CRYP AES/SM4 基本链式模式(ECB, CBC)”* 节。 AES/SM4 电子密码本(ECB) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _CRYP AES/SM4-ECB 模式概述: .. figure:: /assets/images/cryp_aes_sm4_ecb_overview.png :alt: CRYP AES/SM4-ECB 模式概述 :align: center **图 3.2: AES/SM4-ECB 模式概述** ECB 是最简单的操作模式。没有链式操作,也没有特殊的初始化阶段。消息被分成块,每个块单独加密或解密。 注意: 对于解密,在处理第一个块之前需要特殊的密钥调度。 AES/SM4 密码块链接(CBC) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _CRYP AES/SM4-CBC 模式概述: .. figure:: /assets/images/cryp_aes_sm4_cbc_overview.png :alt: CRYP AES/SM4-CBC 模式概述 :align: center **图 3.3: AES/SM4-CBC 模式概述** CBC 操作模式将每个块的输出与下一个块的输入链接起来。为了使每条消息唯一,在第一个块处理期间使用初始化向量。 注意: 对于解密,在处理第一个块之前需要特殊的密钥调度。 AES/SM4 计数器模式(CTR) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _CRYP AES/SM4-CTR 模式概述: .. figure:: /assets/images/cryp_aes_sm4_ctr_overview.png :alt: CRYP AES/SM4-CTR 模式概述 :align: center **图 3.4: AES/SM4-CTR 模式概述** CTR 模式使用 AES/SM4 核心生成密钥流;然后这些密钥与明文进行异或以获得密文,如 NIST 特别出版物 800-38A《分组密码操作模式建议》中所述。 注意: 与 ECB 和 CBC 模式不同,CTR 解密不需要密钥调度,因为在这种链式方案中,AES/SM4 核心始终以加密模式用于产生计数器块。 AES/SM4 Galois/计数器模式(GCM) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _CRYP AES/SM4-GCM 模式概述: .. figure:: /assets/images/cryp_aes_sm4_gcm_overview.png :alt: CRYP AES/SM4-GCM 模式概述 :align: center **图 3.5: AES/SM4-GCM 模式概述** 在 Galois/计数器模式(GCM)中,明文消息被加密,同时并行计算消息验证码(MAC),从而生成相应的密文及其 MAC(也称为验证标签)。它在 NIST 特别出版物 800-38D《分组密码操作模式建议 - Galois/计数器模式(GCM)和 GMAC》中定义。 GCM 模式基于计数器模式下的 AES/SM4 来保证机密性。它使用一个在固定有限域上的乘法器来计算消息验证码。它需要一个初始值和一个在消息末尾的特定 128 位块。 AES/SM4 Galois 消息验证码(GMAC) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _CRYP AES/SM4-GMAC 模式概述: .. figure:: /assets/images/cryp_aes_sm4_gmac_overview.png :alt: CRYP AES/SM4-GMAC 模式概述 :align: center **图 3.6: AES/SM4-GMAC 模式概述** Galois 消息验证码(GMAC)允许验证消息并生成相应的消息验证码(MAC)。它在 NIST 特别出版物 800-38D《分组密码操作模式建议》中定义。Galois/计数器模式(GCM)和 GMAC。 GMAC 类似于 Galois/计数器模式(GCM),不同之处在于它应用于仅由明文的认证数据(即只有头部,没有有效载荷)组成的消息。 AES 带 CBC-MAC 的计数器模式(CCM) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. _CRYP AES/SM4-CCM 模式概述: .. figure:: /assets/images/cryp_aes_sm4_ccm_overview.png :alt: CRYP AES/SM4-CCM 模式概述 :align: center **图 3.7: AES/SM4-CCM 模式概述** CCM 模式基于计数器模式下的 AES/SM4 来保证机密性,并使用 CBC 来计算消息验证码。它需要一个初始值。 与 GCM CCM 链式模式类似,AES/SM4-CCM 模式可以应用于仅由明文认证数据(即只有头部,没有有效载荷)组成的消息。注意,这种使用 CCM 的方式不称为 CMAC(它与 GCM/GMAC 不相似),并且 NIST 不建议使用这种方式。 执行加密操作的 CRYP 流程 ----------------------------- 简介 ~~~~~~~~~~~~~~~ 为了理解加密外设如何工作,下面描述一个典型的加密操作。关于根据密码模式的外设详细用法,请参阅特定章节,例如第 *“CRYP AES/SM4 基本链式模式(ECB, CBC)”* 节。 CRYP 初始化 ~~~~~~~~~~~~~~~ 1. 初始化加密处理器。除了 AES/SM4-ECB 和 AES/SM4-CBC 解密(其中密钥准备需要特定的顺序)外,操作顺序不重要。 a. 通过将 CRYP_STR 寄存器中的 CRYPEN 位设置为 0 并将 MDRST 位设置为 1 来禁用加密处理器。 b. 使用 CRYP_CR 寄存器中的 KEYSIZE 位配置密钥大小(仅 AES 中为 128、192 或 256 位)。 c. 对于密钥由软件配置的,将对称密钥写入 CRYP_Kx 寄存器(根据算法需要写入 2 到 8 个寄存器)。 d. 使用 CRYP_CR 寄存器中的 IDATYPE 或 ODATYPE 位配置数据类型(1、8、16 或 32 位)。 e. 通过将 CRYP_STR 寄存器中的 MDRST 位设置为 0 来释放模式控制器的复位。 f. 在 AES/SM4-ECB 或 AES/SM4-CBC 模式解密的情况下,准备已写入的密钥。首先通过将 CRYP_CR 寄存器中的 ALGOMODE 位设置为 0b000 来配置密钥准备模式。然后将 CRYPEN 位写入 1。等待直到 CRYP_RISR 中的 KEYPRPIS 设置为 1,然后清除 CRYPEN,密钥即准备好用于解密。 g. 通过将 CRYP_STR 寄存器中的 MDRST 位设置为 1 来复位模式控制器。 h. 使用 CRYP_CR 寄存器中的 ALGO 位和 ALGOMODE 位配置算法和链式模式。 i. 通过 CRYP_CR 寄存器中的 ALGODIR 位配置方向(加密/解密)。 j. 当需要时(例如,CBC 或 CTR 链式模式),将初始化向量写入 CRYP_IV0_x 和 CRYP_IV1_x 寄存器。 k. 将要加密的明文字(4 字节)长度写入 CRYP_DIN_CNT 中的 REM_DIN_CNT。 l. 将要获取的密文字(4 字节)长度写入 CRYP_DOUT_CNT 中的 REM_DOUT_CNT。 m. 配置 TO_TH(ICB 总线超时阈值,默认值 255 是禁用此功能)位、INFIFO_AFULL_TH(输入 FIFO 几乎满阈值,默认值:7)位、OUTFIFO_AEMPTY_TH(输出 FIFO 几乎空阈值,默认:0),这些根据用户需要设置。 n. 将最后块的有效字节数内容加载到 CRYP_RLEN 中的 RLEN 位。 2. 通过将 CRYP_FLUSH 寄存器中的 FIFOFLUSH 位写入 1 来刷新输入和输出 FIFO。 **所有情况的初步警告:** 如果选择了 ECB 或 CBC 模式,并且数据不是 64 位(对于 DES)或 128 位(对于 AES/SM4)的倍数,则第二个和最后一个块的管理比下面的序列更复杂。有关更多细节,请参阅第 *“CRYP 密文窃取和数据填充”* 节。 在轮询模式下使用 CPU 追加数据 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 通过将 CRYP_STR 寄存器中的 CRYPEN 位设置为 1 并将 MDRST 位设置为 0 来启用加密处理器 2. 将数据写入输入 FIFO(一个块或直到 FIFO 满)。 3. 重复以下序列,直到处理完倒数第二个数据块: a. 等待直到 CRYP_SR 中的非空标志 OFNE 设置为 1,然后读取输出 FIFO(一个块或直到 FIFO 空)。 b. 等待直到 CRYP_SR 中的非满标志 IFNF 设置为 1,然后写入输入 FIFO(一个块或直到 FIFO 满),除非它是最后一个块。 4. CORE_BUSY 位由加密处理器自动设置。在处理结束时,CORE_BUSY 位返回 0,初始计数寄存器 REM_DIN_CNT 和 REM_DOUT_CNT 返回 0。并且 CRYP_SR 中的 DONE 位将由加密处理器自动设置为 1,表示总数据处理完成。 5. 如果下一个要处理的块是最后一个块,CPU 必须用零填充数据以获得一个完整的块。 6. 操作完成后,可以通过清除 CRYP_STR 寄存器中的 CRYPEN 位来禁用加密处理器。 在中断模式下使用 CPU 追加数据 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 通过设置 CRYP_IMSCR 寄存器中的 INIM 和 OUTIM 位来启用中断。 2. 将输入 FIFO 几乎满阈值配置为 INFIFO_AFULL_TH,输出 FIFO 几乎空阈值配置为 OUTFIFO_AEMPTY_TH,默认值为 7 和 0。 3. 通过将 CRYP_STR 寄存器中的 MDRST 位设置为 1 来软复位加密处理器。 4. 通过将 CRYP_STR 寄存器中的 CRYPEN 位设置为 1 并将 MDRST 位设置为 0 来启用加密处理器。 5. 在管理输入数据的中断服务例程中: a. 如果正在加载最后一个块,CPU 必须用零填充数据以拥有一个完整的块。然后将该块加载到输入 FIFO 中。 b. 如果不是最后一个块,将数据加载到输入 FIFO 中。您可以只加载一个块(DES 为 2 个字,AES/SM4 为 4 个字),或者加载数据直到 CRYP_MISR 中的 INMIS 位返回 0。 c. 在所有情况下,在写入数据的最后一个字之后,通过清除 INIM 中断掩码来禁用中断。 6. 在管理输出数据的中断服务例程中: a. 从输出 FIFO 读取输出数据。您可以只读取一个块(DES 为 2 个字,AES/SM4 为 4 个字),或者读取数据直到 CRYP_MISR 中的 OUTMIS 位返回 0。 b. 当最后一个字被读取后,CRYP_SR 中的 DONE 位将设置为 1。您可以通过清除 OUTIM 位来禁用中断,并通过清除 CRYPEN 位来禁用外设。 c. 如果您读取最后一个块的明文数据(即解密),可以选择丢弃不属于消息/有效载荷的数据。 使用 DMA 追加数据 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1. 准备最后一个数据块,可选地用零填充以获得一个完整的块。 2. 配置 DMA 控制器以从内存传输输入数据并将输出数据从外设传输到内存,如第 *“CRYP DMA 接口”* 节所述。 3. 通过将 CRYP_DMAEN 寄存器中的 DIEN 和 DOEN 位设置为 1 来启用 DMA 输入和输出请求,然后通过将 CRYP_STR 寄存器中的 CRYPEN 位设置为 1 来启用加密处理器。 4. 所有传输和处理都由 DMA 和加密处理器管理。tx_dma_req 指示需要填充数据到输入 FIFO,rx_dma_req 指示输出 FIFO 中有数据需要读取。 **注意:** * 重要的是 DMA 控制器在填满加密处理器输入 FIFO 之前清空加密处理器输出 FIFO。为了实现这一点,应配置 DMA 控制器,使得从加密外设到内存的传输具有比从内存到加密外设的传输更高的优先级。 * 只有当 CORE_BUSY 为低,REM_DIN_CNT 返回到零且 REM_DOUT_CNT 返回到零,并且输出 FIFO 为空时,DONE 才会自动设置为 1。因此,一旦驱动程序检测到 DONE 为零,意味着加密处理器尚未完全处理所有数据,或者输出 FIFO 不为空。 CRYP 核心忙状态 ------------------- 当满足以下所有条件时,加密处理器处于忙状态并正在处理数据(CRYP_SR 寄存器中的 CORE_BUSY 设置为 1): * CRYP_STR 寄存器中 CRYPEN = 1 且 MDRST = 0。 * 输入 FIFO 中有足够的数据(至少两个字用于 DES 或 TDES 算法模式,四个字用于 AES/SM4 算法模式)。 * 输出 FIFO 中有足够的空闲空间(DES 至少两个字位置,AES/SM4 至少四个)。 当加密处理器忙时,不允许对 CRYP_Kx 密钥寄存器、CRYP_IV0_x 和 CRYP_IV1_x 初始化寄存器或 CRYP_CR 寄存器的位进行写操作。否则,处理结果将是错误的。因此,在处理数据块时不可以修改加密处理器的配置。 当 CORE_BUSY 位设置为 1 时,不允许清除 CRYPEN 位。否则,进程将停止工作。 注意: 如果应用程序需要挂起一条消息以处理另一条具有更高优先级的消息,请参阅第 *“CRYP 挂起/恢复操作”* 节。 当在 AES 模式下处理一个块时,如果输出 FIFO 变满并且输入 FIFO 包含至少一个新块,则新块将从输入 FIFO 中弹出,并且 BUSY 位将保持高电平,直到有足够的空间将此新块存储到输出 FIFO 中。 准备用于解密的 CRYP AES/SM4 密钥 ------------------------------------------ 执行 AES/SM4 ECB 或 CBC 解密时,必须准备 AES/SM4 密钥,即在执行解密之前需要完整的加密密钥调度。换句话说,加密最后一轮的密钥必须用作解密的第一轮密钥。 除了 AES/SM4 ECB 或 CBC 解密之外的任何其他 AES/SM4 模式都不需要此准备。如果应用程序软件以某种方式存储了为解密准备的初始密钥,则对于使用给定密码密钥解密的所有数据,密钥调度操作可以只执行一次。 注意: 密钥准备操作的延迟取决于密钥大小(128、192 或 256 位),分别为 11、13 或 15 个时钟周期。 以 128 位密钥大小为例,CRYP 密钥准备过程执行如下: 1. 将加密密钥写入 K0...K3 密钥寄存器(MSB 是 k0[31])。 2. 在 CRYP_CR 中编程 ALGOMODE 位为 0b000。当 CRYPEN 设置为 1 时写入此值会立即开始 AES/SM4 轮的密钥准备。CRYP_SR 寄存器中的 CORE_BUSY 位设置为 1。当 CORE_BUSY 位返回 0 或 CRYP_RISR 中的 KEYPRPIS 设置为 1 时,表示密钥处理完成。 3. 当密钥处理完成时,得到的密钥被复制回 K0...K3 密钥寄存器,CORE_BUSY 位被清除为 0,CRYP_RISR 中的 KEYPRPIS 被设置为 1。 注意: 在解密开始之前,应用程序软件应将 CRYP_STR 中的 MDRST 位设置为 1 以复位模式控制器,然后清除 MDRST 位。 CRYP 密文窃取和数据填充 -------------------------------- 当在 ECB 或 CBC 模式下使用 DES 或 AES/SM4 算法来管理不是块大小(DES 为 64 位,AES/SM4 为 128 位)倍数的消息时,使用密文窃取技术,例如 NIST 特别出版物 800-38A《分组密码操作模式建议:CBC 模式的三种密文窃取变体》中描述的技术。由于加密处理器没有实现此类技术,最后两个块必须由应用程序以特殊方式处理。 注意: 密文窃取技术未记录在此参考手册中。 类似地,当 AES/SM4 算法用于 ECB 或 CBC 以外的其他模式时,不完整的输入数据块(即短于 128 位的块)必须在加密之前由应用程序用零填充(即,额外的位应附加到数据字符串的末尾)。解密后,必须丢弃额外的位。加密处理器没有实现对最后一个块的自动数据填充操作,因此应用程序应遵循第 “执行加密操作的 CRYP 流程” 节中给出的建议来管理不是 128 位倍数的消息。 注意: 填充数据根据 CRYP_CR 寄存器中的 IDATYPE 字段以类似于正常数据的方式进行交换(参见第 *“CRYP 数据寄存器和数据交换”* 节)。 CRYP DES/TDES 基本链式模式(ECB,CBC) ---------------------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~ FIPS PUB 46-3 - 1999(以及 ANSI X9.52-1998)详细解释了 DES 计算核心提供的四种操作模式所涉及的处理:TDES-ECB 加密、TDES-ECB 解密、TDES-CBC 加密和 TDES-CBC 解密。本节仅对每种模式进行简要解释。 DES/TDES-ECB 加密 ~~~~~~~~~~~~~~~~~~~~~~~~ 图 3.8 DES/TDES-ECB 模式解密 说明了 DES 和 TDES 电子密码本(DES/TDES-ECB)模式下的解密。此模式通过在 CRYP_CR 中写入 ALGOMODE 为 0b001 和 ALGODIR 为 0 来选择。 .. _CRYP DES/TDES-ECB 模式解密: .. figure:: /assets/images/cryp_tdes_ecb_dec.png :alt: CRYP DES/TDES-ECB 模式解密 :align: center **图 3.8: DES/TDES-ECB 模式解密** K:密钥;C:密文;I:输入块;O:输出块;P:明文。 一个 64 位的密文块(C)在经过位/字节/半字交换后,用作输入块(I)。与加密过程中使用的相比,密钥序列是反向的。使用 K3 在解密状态下通过 DES 处理输入块。该过程的输出直接反馈到 DES 的输入,使用 K2 在加密状态下执行 DES。新的结果直接馈送到 DES 的输入,使用 K1 在解密状态下执行 DES。得到的 64 位输出块(O),经过位/字节/半字交换后,产生明文(P)。 注意: 有关数据交换的更多信息,请参阅第 *“CRYP 数据寄存器和数据交换”* 节。 详细的 DES/TDES 加密序列可在第 *“执行加密操作的 CRYP 流程”* 节中找到。 DES/TDES-CBC 加密 ~~~~~~~~~~~~~~~~~~~~~~~~ 图 3.9 DES/TDES-CBC 模式加密 说明了 DES 和 TDES 密码块链接(DES/TDESECB)模式下的加密。此模式通过在 CRYP_CR 中写入 ALGOMODE 为 0b010 和 ALGODIR 为 0 来选择。 .. _CRYP DES/TDES-CBC 模式加密: .. figure:: /assets/images/cryp_tdes_cbc_enc.png :alt: CRYP DES/TDES-CBC 模式加密 :align: center **图 3.9: DES/TDES-CBC 模式加密** K:密钥;C:密文;I:输入块;O:输出块;Ps:交换前的明文(解码时)或交换后的明文(编码时);P:明文;IV:初始化向量。 此模式首先将明文消息分成 64 位数据块。在 TCBC 加密中,第一个输入块(I₁),在经过位/字节/半字交换后获得,是通过将第一个明文数据块(P₁)与 64 位初始化向量 IV 进行异或而形成的(I₁ = IV ⊕ P₁)。使用 K₁ 在加密状态下通过 DES 处理输入块。该过程的输出直接反馈到 DES 的输入,该 DES 使用 K₂ 在解密状态下执行 DES。该过程的输出直接馈送到 DES 的输入,该 DES 使用 K₃ 在加密状态下执行 DES。得到的 64 位输出块(O₁)直接用作密文(C₁),即 C₁ = O₁。 然后,这个第一个密文块与第二个明文数据块进行异或以产生第二个输入块,(I₂ = C₁ ⊕ P₂)。注意,I₂ 和 P₂ 现在指的是第二个块。第二个输入块通过 TDES 处理以产生第二个密文块。 这种加密过程继续将连续的密文和明文块“链接”在一起,直到消息中的最后一个明文块被加密。如果消息不包含整数个数据块,则应根据应用程序的规定对最终的部分数据块进行加密。 注意: 有关数据交换的更多信息,请参阅第 *“CRYP 数据寄存器和数据交换”* 节。 详细的 DES/TDES 加密序列可在第 *“执行加密操作的 CRYP 流程”* 节中找到。 DES/TDES-CBC 解密 ----------------------------- 图 3.10 DES/TDES-CBC 模式解密 说明了 DES 和 TDES 密码块链接(DES/TDESECB)模式下的解密。此模式通过在 CRYP_CR 中写入 ALGOMODE 为 0b010 和 ALGODIR 为 1 来选择。 .. _CRYP DES/TDES-CBC 模式解密: .. figure:: /assets/images/cryp_tdes_cbc_dec.png :alt: CRYP DES/TDES-CBC 模式解密 :align: center **图 3.10: DES/TDES-CBC 模式解密** K:密钥;C:密文;I:输入块;O:输出块;Ps:交换前的明文(解码时)或交换后的明文(编码时);P:明文;IV:初始化向量。 在此模式下,第一个密文块(C₁)直接用作输入块(I₁)。与加密过程使用的相比,密钥序列是反向的。使用 :math:`K_3` 在解密状态下通过 DES 处理输入块。该过程的输出直接馈送到 DES 的输入,在该输入处使用 K₂ 在加密状态下处理 DES。得到的值直接馈送到 DES 的输入,在该输入处使用 K₁ 在解密状态下处理 DES。得到的输出块与 IV(必须与加密期间使用的相同)进行异或以产生第一个明文块(𝑃₁ = 𝑂₁ ⊕ 𝐼𝑉)。然后第二个密文块用作下一个输入块并通过 TDES 处理。得到的输出块与第一个密文块进行异或以产生第二个明文数据块(𝑃₂ = 𝑂₂ ⊕ 𝐶₁)。 注意,P₂ 和 O₂ 指的是第二个数据块。 DES/TDES-CBC 解密过程以这种方式继续,直到最后一个完整的密文块被解密。代表部分数据块的密文必须根据应用程序的规定进行解密。 注意: 有关数据交换的更多信息,请参阅第 *“CRYP 数据寄存器和数据交换”* 节。 详细的 DES/TDES 解密序列可在第 *“执行加密操作的 CRYP 流程”* 节中找到。 CRYP AES/SM4 基本链式模式(ECB,CBC) --------------------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~~~~~ AES/SM4 计算核心提供四种基本操作模式:AES/SM4-ECB 加密、AES/SM4-ECB 解密、AES/SM4-CBC 加密和 AES/SM4-CBC 解密。本节仅对每种模式进行简要解释。 AES/SM4 ECB 加密 ~~~~~~~~~~~~~~~~~~~~~~~~ 图 3.11 AES/SM4-ECB 模式加密 说明了 AES 电子密码本(AES/SM4-ECB)模式加密。此模式通过在 CRYP_CR 中写入 ALGOMODE 为 0b001 和 ALGODIR 为 0 来选择。 .. _CRYP AES/SM4-ECB 模式加密: .. figure:: /assets/images/cryp_aes_sm4_ecb_enc.png :alt: CRYP AES/SM4-ECB 模式加密 :align: center **图 3.11: AES/SM4-ECB 模式加密** 1. K:密钥;C:密文;I:输入块;O:输出块;P:明文。 2. AES: * 如果密钥大小 = 128:密钥 = [K0 K1]。 * 如果密钥大小 = 192:密钥 = [K0 K1 K2]。 * 如果密钥大小 = 256:密钥 = [K0 K1 K2 K3]。 3. SM4: * 密钥大小 = 128:密钥 = [K0 K1]。 在此模式下,一个 128 位的明文数据块(P)在经过位/字节/半字交换后用作输入块(I)。使用 128、192 或 256 位密钥在加密状态下通过 AES 处理输入块。并使用 128 位密钥在加密状态下通过 SM4 处理输入块。得到的 128 位输出块(O)在经过位/字节/半字交换后用作密文(C)。然后它被推入输出 FIFO。有关数据交换的更多信息,请参阅第 *“CRYP 数据寄存器和数据交换”* 节。 AES/SM4 ECB 解密 ~~~~~~~~~~~~~~~~~~~~~~~~ 图 3.12 AES/SM4-ECB 模式解密 说明了 AES/SM4 电子密码本(AES/SM4-ECB)模式解密。此模式通过在 CRYP_CR 中写入 ALGOMODE 为 0b001 和 ALGODIR 为 1 来选择。 .. _CRYP AES/SM4-ECB 模式解密: .. figure:: /assets/images/cryp_aes_sm4_ecb_dec.png :alt: CRYP AES/SM4-ECB 模式解密 :align: center **图 3.12: AES/SM4-ECB 模式解密** 1. K:密钥;C:密文;I:输入块;O:输出块;P:明文。 2. AES: * 如果密钥大小 = 128:密钥 = [K0 K1]。 * 如果密钥大小 = 192:密钥 = [K0 K1 K2]。 * 如果密钥大小 = 256:密钥 = [K0 K1 K2 K3]。 3. SM4: * 密钥大小 = 128:密钥 = [K0 K1]。 要在 ECB 模式下执行 AES/SM4 解密,必须准备密钥(需要执行完整的加密密钥调度)以收集最后一轮密钥,并将其用作解密密文的第一轮密钥。此准备阶段由核心计算。有关如何准备密钥的更多详细信息,请参阅第 *“准备用于解密的 CRYP AES/SM4 密钥”* 节。 当密钥准备完成后,解密进行如下:一个 128 位的密文块(C)在经过位/字节/半字交换后用作输入块(I)。与加密过程相比,密钥序列是反向的。得到的 128 位输出块(O),经过位/字节或半字交换后,产生明文(P)。AES/SM4-CBC 解密过程以这种方式继续,直到最后一个完整的密文块被解密。有关数据交换的更多信息,请参阅第 *“CRYP 数据寄存器和数据交换”* 节。 AES/SM4 CBC 加密 ~~~~~~~~~~~~~~~~~~~~~~~~ 图 3.13 AES/SM4-CBC 模式加密 说明了 AES/SM4 密码块链接(AES/SM4-CBC)模式加密。此模式通过在 CRYP_CR 中写入 ALGOMODE 为 0b010 和 ALGODIR 为 0 来选择。 .. _CRYP AES/SM4-CBC 模式加密: .. figure:: /assets/images/cryp_aes_sm4_cbc_enc.png :alt: CRYP AES/SM4-CBC 模式加密 :align: center **图 3.13: AES/SM4-CBC 模式加密** 1. K:密钥;C:密文;I:输入块;O:输出块;Ps:交换前的明文(解码时)或交换后的明文(编码时);P:明文;IV:初始化向量。 2. AES: * 如果密钥大小 = 128:密钥 = [K0 K1]。 * 如果密钥大小 = 192:密钥 = [K0 K1 K2]。 * 如果密钥大小 = 256:密钥 = [K0 K1 K2 K3]。 3. SM4: * 密钥大小 = 128:密钥 = [K0 K1]。 在此模式下,第一个输入块(I₁)在经过位/字节/半字交换后获得,是通过将第一个明文数据块(P₁)与 128 位初始化向量 IV 进行异或而形成的(I₁ = IV ⊕ P)。使用 128、192 或 256 位密钥(K0...K3)在加密状态下通过 AES 处理输入块。并使用 128 位密钥(K0 K1)在加密状态下通过 SM4 处理输入块。得到的 128 位输出块(O₁)直接用作密文(C₁),即,C₁ = O₁。然后,这个第一个密文块与第二个明文数据块进行异或以产生第二个输入块,(I₂ = C₁ ⊕ P₂)。注意,I₂ 和 P₂ 现在指的是第二个块。第二个输入块通过 AES/SM4 处理以产生第二个密文块。这种加密过程继续将连续的密文和明文块“链接”在一起,直到消息中的最后一个明文块被加密。 如果消息不包含整数个数据块,则应根据应用程序的规定对最终的部分数据块进行加密,如第 *“CRYP 密文窃取和数据填充”* 节中所解释。 有关数据交换的更多信息,请参阅第 *“CRYP 数据寄存器和数据交换”* 节。 详细的 AES/SM4 加密序列可在第 *“执行加密操作的 CRYP 流程”* 节中找到。 AES/SM4 CBC 解密 ~~~~~~~~~~~~~~~~~~~~~~~~ 图 3.14 AES/SM4-CBC 模式解密 说明了 AES/SM4 密码块链接(AES/SM4-CBC)模式解密。此模式通过在 CRYP_CR 中写入 ALGOMODE 为 0b010 和 ALGODIR 为 1 来选择。 .. _CRYP AES/SM4-CBC 模式解密: .. figure:: /assets/images/cryp_aes_sm4_cbc_dec.png :alt: CRYP AES/SM4-CBC 模式解密 :align: center **图 3.14: AES/SM4-CBC 模式解密** 1. K:密钥;C:密文;I:输入块;O:输出块;Ps:交换前的明文(解码时)或交换后的明文(编码时);P:明文;IV:初始化向量。 2. AES: * 如果密钥大小 = 128:密钥 = [K0 K1]。 * 如果密钥大小 = 192:密钥 = [K0 K1 K2]。 * 如果密钥大小 = 256:密钥 = [K0 K1 K2 K3]。 3. SM4: * 密钥大小 = 128:密钥 = [K0 K1]。 在 CBC 模式下,与 ECB 模式类似,必须准备密钥才能执行 AES/SM4 解密。有关如何准备密钥的更多详细信息,请参阅第 *“准备用于解密的 CRYP AES/SM4 密钥”* 节。当密钥准备过程完成后,解密进行如下:第一个 128 位密文块( :math:`C_1` )直接用作输入块( :math:`I_1` )。使用 128、192 或 256 位密钥在解密状态下通过 AES 处理输入块。并使用 128 位密钥在解密状态下通过 SM4 处理输入块。得到的输出块与 128 位初始化向量 IV(必须与加密期间使用的相同)进行异或以产生第一个明文块( :math:`P_1 = O_1 ⊕ IV` )。然后第二个密文块用作下一个输入块并通过 AES/SM4 处理。得到的输出块与第一个密文块进行异或以产生第二个明文数据块( :math:`P_2 = O_2 ⊕ C_1` )。注意 :math:`P_2` 和 :math:`O_2` 指的是第二个数据块。AES/SM4-CBC 解密过程以这种方式继续,直到最后一个完整的密文块被解密。最后一个完整的密文块被解密。 代表部分数据块的密文必须根据应用程序的规定进行解密,如第 *“CRYP 密文窃取和数据填充”* 节中所解释。 有关数据交换的更多信息,请参阅第 *“CRYP 数据寄存器和数据交换”* 节。 详细的 AES/SM4 解密序列可在第 *“执行加密操作的 CRYP 流程”* 节中找到。 CRYP AES/SM4 计数器模式(AES/SM4-CTR --------------------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~~~~~ AES/SM4 计数器模式(CTR)使用 AES/SM4 块作为密钥流生成器。生成的密钥然后与明文进行异或以获得密文。 CTR 链式模式在 NIST 特别出版物 800-38A《分组密码操作模式建议》中定义。图3.15 计数器模式的消息构建 给出了 CTR 模式下典型消息的构建。 .. _CRYP 计数器模式的消息构建: .. figure:: /assets/images/cryp_aes_sm4_ctr_msg.png :alt: CRYP 计数器模式的消息构建 :align: center **图 3.15: 计数器模式的消息构建** 此消息的结构如下: * 一个 16 字节的初始计数器块(ICB),由三个不同的字段组成: - 一个 nonce:一个 32 位、一次性使用的值(即,应为每次新的通信分配一个新的 nonce)。 - 初始化向量(IV):一个 64 位的值,对于给定密钥下的每次模式执行必须是唯一的。 - 计数器:一个 32 位的小端整数,每次处理一个块时递增。计数器的初始值应设置为 1。 * 明文(P)经过认证并加密为密文 C,具有已知长度。该长度可以不是 16 字节的倍数,在这种情况下需要明文填充。 AES/SM4 CTR 处理 ~~~~~~~~~~~~~~~~~~~~~~~~ 图 3.16 AES/SM4-CTR 模式加密 以及图3.17 AES/SM4-CTR 模式解密 描述了此外设内实现的 AES/SM4-CTR 加密和解密过程。此模式通过在 CRYP_CR 中写入 ALGOMODE 位域为 0b011 来选择。 .. _CRYP AES/SM4-CTR 模式加密: .. figure:: /assets/images/cryp_aes_sm4_ctr_enc.png :alt: CRYP AES/SM4-CTR 模式加密 :align: center **图 3.16: AES/SM4-CTR 模式加密** K:密钥;C:密文;I:输入块;O:输出块;Ps:交换前的明文(解码时)或交换后的明文(编码时);Cs:交换后的密文(解码时)或交换前的密文(编码时);P:明文;IV:初始化向量。 .. _CRYP AES/SM4-CTR 模式解密: .. figure:: /assets/images/cryp_aes_sm4_ctr_dec.png :alt: CRYP AES/SM4-CTR 模式解密 :align: center **图 3.17: AES/SM4-CTR 模式解密** K:密钥;C:密文;I:输入块;O:输出块;Ps:交换前的明文(解码时)或交换后的明文(编码时);Cs:交换后的密文(解码时)或交换前的密文(编码后交换时);Cs:交换后的密文(解码时)或交换前的密文(编码时);P:明文;IV:初始化向量。 在 CTR 模式下,输出块与后续的输入块在输入到算法之前进行异或。外设中的初始化向量必须按照表3.1 计数器模式初始化向量 所示进行初始化。 .. list-table:: 表 3.1:计数器模式初始化向量 :widths: 20 20 20 20 :header-rows: 1 * - CRYP_IV0_0[31:0] - CRYP_IV0_1[31:0] - CRYP_IV0_2[31:0] - CRYP_IV0_3[31:0] * - nonce - IV[63:32] - IV[31:0] - 32-bit counter=0x1 与 CBC 模式不同,CBC 模式在处理第一个数据块时只使用一次 CRYP_IV0_x 寄存器,而在 CTR 模式下,IV 寄存器用于处理每个数据块,并且外设递增最低有效的 32 位(保持其他最高有效的 96 位不变)。CTR 解密与 CTR 加密没有区别,因为核心总是加密当前的计数器块以产生将与明文或密文输入进行异或的密钥流。因此,当 ALGOMODE 设置为 0b011 时,ALGODIR 无关紧要。 在此模式下,密钥必须不为解密做准备。 必须使用以下序列在 CTR 链式模式下执行加密或解密: 1. 确保通过清除 CRYP_STR 寄存器中的 CRYPEN 位来禁用加密处理器。 2. 配置 CRYP_CR 如下: a. 编程 ALGOMODE 位为 0b011 以选择 CTR 模式。 b. 通过 IDATYPE 和 ODATYPE 位配置数据类型(1、8、16 或 32 位)。 3. 初始化密钥寄存器(128、192 和 256 位)到 CRYP_Kx,以及初始化向量(IV),如表3.1 计数器模式初始化向量 所述。 4. 配置 TO_TH(总线超时阈值,默认值 255 是禁用此功能)位、IN_FIFO_AFULL_TH(输入 FIFO 几乎满阈值,默认值:7)位、OUTFIFO_AEMPTY_TH(输出 FIFO 几乎空阈值,默认:0),这些根据用户需要设置。 5. 配置 REM_DIN_CNT 位为要写入输入 FIFO 的字数,以及 REM_DOUT_CNT 位为要从输出 FIFO 读取的字数;将最后块的有效字节数配置到 CRYP_RLEN 中的 RLEN 位域。 6. 通过将 CRYP_FLUSH 寄存器中的 FIFOFLUSH 位写入 1 来刷新输入和输出 FIFO。 7. 如果是最后一个块,可选地用零填充数据以获得一个完整的块。 8. 将数据追加到加密处理器并读取结果。三种可能的情况在第 *“执行加密操作的 CRYP 流程”* 节中描述。 9. 重复上一步,直到处理完倒数第二个块。对于最后一个块,执行前两步。对于这最后一个块,当最后一个块大小小于 16 字节时,驱动程序必须丢弃不属于数据的部分。 CRYP AES/SM4 Galois/计数器模式(GCM) --------------------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~~~~~ AES/SM4 Galois/计数器模式(GCM)允许加密和验证明文,并生成相应的密文和标签(也称为消息验证码)。为确保机密性,GCM 算法基于计数器模式下的 AES/SM4。它使用在固定有限域上的乘法器来生成标签。GCM 链式模式在 NIST 特别出版物 800-38D《分组密码操作模式建议 - Galois/计数器模式(GCM)和 GMAC》中定义。图 3.18 Galois/计数器模式的消息构建 给出了 GCM 模式下典型消息的构建。 .. _CRYP Galois/计数器模式的消息构建: .. figure:: /assets/images/cryp_aes_sm4_gcm_msg.png :alt: CRYP Galois/计数器模式的消息构建 :align: center **图 3.18: Galois/计数器模式的消息构建** 此消息的结构定义如下: * 一个 16 字节的初始计数器块(ICB),由两个不同的字段组成: - 初始化向量(IV):一个 96 位的值,对于给定密钥下的每次模式执行必须是唯一的。注意,GCM 标准支持短于 96 位的 IV,但在这种情况下适用严格的规则; - 计数器:一个 32 位的大端整数,每次处理一个块时递增。根据 NIST 规范,处理第一个有效载荷块时计数器值为 0x2。 * 认证头部 A(也称为额外认证数据)具有已知的长度 Len(A),该长度可以不是 16 字节的倍数,并且不能超过 :math:`2^{64} - 1` 位。这部分消息仅被认证,不被加密。 * 明文消息(P)经过认证并加密为密文 C,具有已知的长度 Len(P),该长度可以不是 16 字节的倍数,并且不能超过 :math:`2^{32} - 2` 个 128 位块。 注意: GCM 标准规定密文 C 与明文 P 具有相同的位长度,C 和 P 也称为有效载荷。 * 当消息的一部分(AAD 或 P)的长度不是 16 字节的倍数时,需要特殊的填充方案。 * 最后一个块由 A 的长度(在 64 位上)和密文 C 的长度(在 64 位上)组成,如表3.2 GCM 最后块定义 所示。 .. list-table:: 表 3.2:GCM 最后块定义 :widths: 20 20 20 20 20 :header-rows: 1 * - 端序 - 位[31:0] - 位[63:32] - 位[95:64] - 位[127:96] * - 输入数据 - 有效载荷长度[31:0] - 有效载荷长度[63:32] - 头部长度[31:0] - 头部长度[63:32] AES/SM4 GCM 处理 ~~~~~~~~~~~~~~~~~~~~~~~~ 此模式通过在 CRYP_CR 中写入 ALGOMODE 位域为 0b100 来选择。GCM 模式下明文的机密性机制是计数器模式的一种变体,具有特定的 32 位递增函数,该函数生成必要的计数器块序列。CRYP_IV 寄存器用于处理每个数据块。加密处理器自动递增计数器块的最低 32 位。应用程序写入的第一个计数器块(CB₁)等于初始计数器块加一(参见表3.3 GCM 模式 IV 寄存器初始化)。 .. list-table:: 表 3.3:GCM 模式 IV 寄存器初始化 :widths: 20 20 20 20 :header-rows: 1 * - CRYP_IV0_0[31:0] - CRYP_IV0_1[31:0] - CRYP_IV0_2[31:0] - CRYP_IV0_3[31:0] * - ICB[127:96] - ICB[95:64] - ICB[63:32] - ICB[31:0] 32 位计数器= 0x2 注意: 在此模式下,密钥不必为解密做准备。 GCM 模式中的认证机制基于一个称为 GF2mul 的哈希函数,该函数在二进制 Galois 域内执行与固定参数(称为哈希子密钥(H))的乘法。 要处理 GCM 消息,驱动程序必须经历四个阶段,这些阶段在以下小节中描述。 * 初始化阶段:外设准备 GCM 哈希子密钥(H)并执行 IV 处理。 * 头部阶段:外设处理额外认证数据(AAD),仅进行哈希计算。 * 有效载荷阶段:外设处理明文(P),进行哈希计算、密钥流加密和数据异或。对于密文(C)的操作方式类似。 * 最终阶段:外设使用数据的最后一个块生成认证标签(T)。 1. GCM 初始化阶段 ~~~~~~~~~~~~~~~~~~~~~~~~ 在此第一步中,计算 GCM 哈希子密钥(H)并内部保存以供处理所有块时使用。建议遵循以下顺序: 1) 确保通过清除 CRYP_STR 寄存器中的 CRYPEN 位并将 MDRST 位设置为 1 来禁用加密处理器。 2) 通过编程 CRYP_CR 中的 ALGOMODE 位为 0b100 来选择 GCM 链式模式。 3) 在 CRYP_CR 中配置 GCM_COMPH 位为 0b00,以指示初始化阶段正在进行。 4) 初始化密钥寄存器(AES 为 128、192 和 256 位;SM4 为 128 位)到 CRYP_Kx,以及初始化向量(IV),如表3.3 GCM 模式 IV 寄存器初始化 所定义。 5) 将 CRYPEN 位设置为 1 并清除 MDRST 位为 0 以开始计算哈希密钥。 6) 等待 CRYP_SR 中的 CORE_BUSY 位返回 0,然后再进入下一阶段。 7) 清除 CRYPEN 位为 0,并通过将 CRYP_STR 寄存器中的 MDRST 位设置为 1 来复位模式控制器。 2. GCM 头部阶段 ~~~~~~~~~~~~~~~~~~~~~~~~ 以下序列应在 GCM 初始化阶段之后执行。它必须在跳转到有效载荷阶段之前完成。该序列对于加密和解密是相同的。 8) 在 CRYP_CR 中将 GCM_COMPH 位设置为 0b01,以指示头部阶段正在进行。 9) 根据用户需要配置 CRYP_IMSCR 寄存器。 10) 配置 TO_TH(ICB 总线超时阈值,默认值 255 是禁用此功能)位、IN_FIFO_AFULL_TH(输入 FIFO 几乎满阈值,默认值:7)位、OUTFIFO_AEMPTY_TH(输出 FIFO 几乎空阈值,默认:0),这些根据用户需要设置。 11) 配置 REM_DIN_CNT 位为要写入输入 FIFO 的字数;将最后块的有效字节数配置到 CRYP_RLEN 中的 RLEN 位域。 12) 将 CRYPEN 位设置为 1 并将 MDRST 位清除为 0 以开始接受数据。 13) 如果是最后一个额外认证数据块,可选地用零填充数据以获得一个完整的块。 14) 将额外认证数据追加到加密处理器中。三种可能的情况在第 *“执行加密操作的 CRYP 流程”* 节中描述。 15) 重复上一步,直到处理完倒数第二个额外认证数据块。对于最后一个块,执行前两步。一旦提供了所有额外认证数据,等待 DONE 位标志再次设置,然后再进入下一阶段。 注意: 如果没有额外认证数据,即 Len(A)=0,则可以跳过此阶段。 3. GCM 有效载荷阶段(加密或解密) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当有效载荷大小不为零时,此序列必须在 GCM 头部阶段之后执行。在此阶段,加密/解密后的有效载荷存储在输入 FIFO 中。 16) 将 CRYPEN 位设置为 0,并将 MDRST 位设置为 1。 17) 在 CRYP_CR 寄存器中配置 GCM_COMPH 为 0b10,以指示有效载荷阶段正在进行。 18) 配置 REM_DIN_CNT 位为要写入输入 FIFO 的字数,以及 REM_DOUT_CNT 位为要从输出 FIFO 读取的字数;将最后块的有效字节数配置到 CRYP_RLEN 中的 RLEN 位域。 19) 通过 CRYP_CR 中的 ALGODIR 位选择算法方向(0 为加密,1 为解密)。 20) 将 CRYPEN 位设置为 1 并将 MDRST 位清除为 0 以开始接受数据。 21) 如果是最后一个密文或明文块,可选地用零填充数据以获得一个完整的块。有关解密或加密的更多细节,请参阅第 *“CRYP 密文窃取和数据填充”* 节。 22) 将有效载荷数据追加到加密处理器,并读取结果。三种可能的情况在第 *“执行加密操作的 CRYP 流程”* 节中描述。 23) 重复上一步,直到倒数第二个明文块被加密或最后一个密文块被解密。对于最后一个明文块(仅加密),执行前两步。对于最后一个块,当最后一个块大小小于 16 字节时,驱动程序必须丢弃不属于密文或密文的部分。一旦提供了所有有效载荷数据,等待 DONE 位标志再次设置。 24) 清除 CRYPEN 位为 0 并将 MDRST 位设置为 1 以禁用加密处理器。 注意: 如果没有有效载荷数据,即 Len(C)=0(参见 GMAC 模式),则可以跳过此阶段。 4. GCM 最终阶段 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在这最后一步中,加密处理器生成 GCM 认证标签并将其存储在输出 FIFO 中。 25) 在 CRYP_CR 中配置 GCM_CCMPH[1:0] 为 0b11,以指示最终阶段正在进行。在同一寄存器中将 ALGODIR 位设置为 0。 26) 初始化初始化向量(IV),如表3.3 GCM 模式 IV 寄存器初始化 所定义。 27) 写入输入数据四次。输入必须由额外认证数据的比特长度(编码在 64 位上)与有效载荷的比特长度(编码在 64 位上)连接而成,如表3.2 GCM 最后块定义 所示。 28) 将 CRYPEN 位设置为 1 并将 MDRST 位清除为 0 以启用加密处理器。 29) 等待直到 CRYP_SR 寄存器中的 OFNE 标志(FIFO 输出非空)设置为 1。 30) 读取输出 FIFO 四次:输出对应于认证标签。 31) 禁用加密处理器(CRYP_CR 中 CRYPEN 位 = 0)。 32) 如果正在执行认证解密,则将生成的标签与随消息传递的预期标签进行比较。 CRYP AES/SM4 Galois 消息验证码(GMAC) --------------------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~~~~~ Galois 消息验证码(GMAC)允许验证明文并生成相应的标签信息(也称为消息验证码)。它基于 GCM 算法,如 NIST 特别出版物 800-38D《分组密码操作模式建议 - Galois/计数器模式(GCM)和 GMAC》所定义。 图 3.19 Galois 消息验证码模式的消息构建 给出了 GMAC 模式下典型消息的构建。 .. _CRYP Galois 消息验证码模式的消息构建: .. figure:: /assets/images/cryp_aes_sm4_gmac_msg.png :alt: CRYP Galois 消息验证码模式的消息构建 :align: center **图 3.19: Galois 消息验证码模式的消息构建** AES/SM4 GMAC 处理 ~~~~~~~~~~~~~~~~~~~~~~~~ 此模式通过在 CRYP_CR 中写入 ALGOMODE 位域为 0b100 来选择。GMAC 算法对应于应用于仅由头部组成的消息的 GCM 算法。因此,所有步骤和设置与 GCM 模式相同,只是有效载荷阶段未使用。 CRYP AES/SM4 带 CBC-MAC 的计数器模式(CCM) --------------------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~~~~~ AES/SM4 带密码块链接-消息验证码(CCM)算法允许加密和验证明文,并生成相应的密文和标签(也称为消息验证码)。为确保机密性,CCM 算法基于计数器模式下的 AES/SM4。它使用密码块链接技术来生成消息验证码。这通常称为 CBC-MAC。 注意: NIST 不批准这种 CBC-MAC 作为 CCM 规范之外的认证模式。 CCM 链式模式在 NIST 特别出版物 800-38C《分组密码操作模式建议 - 用于认证和机密性的 CCM 模式》中规定。图3.20 带 CBC-MAC 的计数器模式的消息构建 给出了 CCM 模式下典型消息的构建。 .. _CRYP 带 CBC-MAC 的计数器模式的消息构建: .. figure:: /assets/images/cryp_aes_sm4_ccm_msg.png :alt: CRYP 带 CBC-MAC 的计数器模式的消息构建 :align: center **图 3.20: 带 CBC-MAC 的计数器模式的消息构建** 此消息的结构如下: * 一个 16 字节的第一个认证块(标准中称为 B0),由三个不同的字段组成: - Q:P 的字节长度的位串表示(Plen)。 - 一个 nonce(N):一次性使用的值(即,应为每次新的通信分配一个新的 nonce)。Nonce 的大小 Nlen + Plen 的大小应等于 15 字节。 - 标志:包含四个控制信息标志的最高有效字节,如标准所规定。它包含两个 3 位字符串(bit5:3)来编码值 t(以字节表示的 MAC 长度)和 q(bit2:0 为 q - 1,表示明文长度字段所占字节数,使得 :math:`Plen < 2^{8q}` 字节)。注意,与 q 关联的计数器块范围等于 :math:`Plen < 2^{8q} - 4`,即,如果 q 的最大值是 8,则加密中使用的计数器块应为 60 位;bit6 置 1 表示存在附加认证数据。 注意: 加密外设只能管理长度 :math:`Plen < 2^{36} + 1` 字节的填充明文/密文消息。 * 16 字节的块(B)与关联数据(A)相关联。这部分消息仅被认证,不被加密。此部分具有已知长度 ALen,该长度可以不是 16 字节的倍数(参见图3.20 带 CBC-MAC 的计数器模式的消息构建)。标准还规定,在第一个消息块(B1)的最高有效位上,关联数据长度(以字节表示)(a)必须按以下方式编码: - 如果 :math:`0 < a < 2^{16} - 28` 则编码为 :math:`[a]_{16}`, 即两个字节。 - 如果 :math:`2^{16} - 28 < a < 2^{32}` 则编码为 :math:`0xff||0xfe||[a]_{32}`, 即六个字节。 - 如果 :math:`2^{32} < a < 2^{64}` 则编码为 :math:`0xff||0xff||[a]_{64}`, 即十个字节。 * 16 字节的块(B)与明文消息(P)相关联,该消息经过认证并加密为密文 C,具有已知的长度 Plen。该长度可以不是 16 字节的倍数(参见图3.20 带 CBC-MAC 的计数器模式的消息构建),但不能超过 :math:`2^{32}` 个 128 位块。 * 加密的 MAC(T),长度为 Tlen,附加到总长度为 Clen 的密文 C。 * 当消息的一部分(A 或 P)的长度不是 16 字节的倍数时,需要特殊的填充方案。 注意: CCM 链式模式也可以仅用于关联数据(即没有有效载荷)。 例如,NIST 特别出版物 800-38C 的 C.1 部分给出了以下示例: N: 10111213 141516 (Nlen=56 位或 0x7 字节) A: 00010203 04050607 (Alen=64 位或 0x8 字节) P: 20212223 (Plen=32 位即 Q= 0x4 字节) T: 60843410 (Tlen=32 位或 t=4) B0: 4f101112 13141516 00000000 00000004 B1: 00080001 02030405 06070000 00000000 B2: 20212223 00000000 00000000 00000000 CTR0: 0710111213 141516 00000000 00000000 CTR1: 0710111213 141516 00000000 00000001 控制块 CTRx 的使用在下一节中解释。从第一个块(B0)生成 CTR0 必须由软件管理。 AES/SM4 CCM 处理 ~~~~~~~~~~~~~~~~~~~~~~~~ 此模式通过在 CRYP_CR 中写入 ALGOMODE 位域为 0b110 来选择。生成-加密过程的数据输入是有效的 nonce、有效的有效载荷字符串和有效的关联数据字符串,都经过适当的格式化。CBC 链式机制应用于格式化数据以生成 MAC,其长度是已知的。计数器模式加密(需要足够长的计数器块序列作为输入)应用于有效载荷字符串并单独应用于 MAC。结果数据,称为密文 C,是明文 P 上生成-加密过程的输出。 CRYP_IVx 寄存器用于处理每个数据块。加密处理器自动递增 CTR 计数器,其位长度由第一个块(B0)定义。应用程序写入的第一个计数器 CTR0 等于 B0,其前 5 位被清零,包含 P 字节长度的最高有效位也被清零,然后加一得到 CTR1(参见表3.4 CCM 模式 IV0 寄存器初始化和表3.5 CCM 模式 IV1 寄存器初始化)。 .. list-table:: 表 3.4:CCM 模式 IV0 寄存器初始化 :widths: 20 20 20 20 :header-rows: 1 * - CRYP_IV0_0[31:0] - CRYP_IV0_1[31:0] - CRYP_IV0_2[31:0] - CRYP_IV0_3[31:0] * - CTR0[127:96] - CTR0[95:64] - CTR0[63:32] - CTR0[31:0] .. list-table:: 表 3.5:CCM 模式 IV1 寄存器初始化 :widths: 40 20 20 40 :header-rows: 1 * - CRYP_IV1_0[31:0] - CRYP_IV1_1[31:0] - CRYP_IV1_2[31:0] - CRYP_IV1_3[31:0] * - B0[127:96],其中 Q 长度位被设置为 0,除了位 0 被设置为 1 - B0[95:64] - B0[95:64] - B0[31:0],其中最高的 5 位被设置为 0(标志位) 注意: 在此模式下,密钥不必为解密做准备。 要处理 CCM 消息,驱动程序必须经历四个阶段,如下所述。 * 初始化阶段:外设处理第一个块并准备第一个计数器块。 * 头部阶段:外设处理关联数据(A),仅进行哈希计算。 * 有效载荷阶段:外设处理明文(P),进行哈希计算、计数器块加密和数据异或。对于密文(C)的操作方式类似。 * 最终阶段:外设生成消息验证码(MAC) 1. CCM 初始化阶段 ~~~~~~~~~~~~~~~~~~~~~~~~ 在此阶段,输出 FIFO 不包含任何输出数据。建议遵循以下顺序: 1) 确保通过清除 CRYP_STR 寄存器中的 CRYPEN 位并通过设置 MDRST 位为 1 来复位并禁用加密处理器。 2) 通过编程 CRYP_CR 寄存器中的 ALGOMODE 位为 0b110 来选择 CCM 链式模式。 3) 在 CRYP_CR 中配置 GCM_CCMPH 位为 0b00,以指示我们处于初始化阶段。 4) 初始化密钥寄存器(128、192 和 256 位)到 CRYP_Kx,以及带有 CTR0 信息的初始化向量(IV0),如表3.4 CCM 模式 IV0 寄存器初始化 所定义。 5) 使用 B0 信息初始化初始化向量(IV1),如表3.5 CCM 模式 IV1 寄存器初始化所定义。 6) 将 CRYP_STR 中的 CRYPEN 位设置为 1 并将 MDRST 位清除为 0 以启动加密处理器。 7) 等待 CORE_BUSY 位返回 0,然后再进入下一阶段。 8) 通过清除 CRYPEN 位并通过设置 CRYP_STR 寄存器中的 MDRST 位为 1 来复位模式控制器来禁用加密处理器。 2. CCM 头部阶段 ~~~~~~~~~~~~~~~~~~~~~~~~ 以下序列应在 CCM 初始化阶段之后执行。它必须在跳转到有效载荷阶段之前完成。该序列对于加密和解密是相同的。在此阶段,输出 FIFO 不包含任何输出数据。 9) 在 CRYP_CR 中将 GCM_CCMPH 位设置为 0b01,以指示头部阶段正在进行。 10) 配置 TO_TH(总线超时阈值,默认值 255 是禁用此功能)位、INFIFO_AFULL_TH(输入 FIFO 几乎满阈值,默认值:7)位、OUTFIFO_AEMPTY_TH(输出 FIFO 几乎空阈值,默认:0),这些根据用户需要设置。 11) 配置 REM_DIN_CNT 位为要写入输入 FIFO 的字数,以及 REM_DOUT_CNT 位为要从输出 FIFO 读取的字数;将最后块的有效字节数配置到 CRYP_RLEN 中的 RLEN 位域。 12) 将 CRYPEN 位设置为 1 并将 MDRST 位清除为 0 以开始接受数据。 13) 如果是最后一个关联数据块,可选地用零填充数据以获得一个完整的块。 14) 将关联数据追加到加密处理器中。三种可能的情况在第 *“执行加密操作的 CRYP 流程”* 节中描述。 15) 重复上一步,直到处理完倒数第二个关联数据块。对于最后一个块,执行前两步。一旦提供了所有额外认证数据,等待 DONE 位标志设置后再进入下一阶段。 16) 通过清除 CRYPEN 位并通过设置 CRYP_STR 寄存器中的 MDRST 位为 1 来复位模式控制器来禁用加密处理器。 注意: 如果没有关联数据(Alen=0),则可以跳过此阶段。 注意: 关联数据的第一个块 B1 必须使用关联数据长度进行格式化。此任务必须由驱动程序管理。 3. CCM 有效载荷阶段(加密或解密) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当有效载荷大小不为零时,此序列必须在 CCM 头部阶段之后执行。在此阶段,加密/解密后的有效载荷存储在 CRYP_DOUT 寄存器中。 17) 在 CRYP_CR 中配置 GCM_CCMPH 位为 0b10,以指示有效载荷阶段正在进行。 18) 通过 CRYP_CR 中的 ALGODIR 位选择算法方向(0 为加密,1 为解密)。 19) 配置 TO_TH(总线超时阈值,默认值 255 是禁用此功能)位、INFIFO_AFULL_TH(输入 FIFO 几乎满阈值,默认值:7)位、OUTFIFO_AEMPTY_TH(输出 FIFO 几乎空阈值,默认:0),这些根据用户需要设置。 20) 配置 REM_DIN_CNT 位为要写入输入 FIFO 的字数,以及 REM_DOUT_CNT 位为要从输出 FIFO 读取的字数;将最后块的有效字节数配置到 CRYP_RLEN 中的 RLEN 位域。 21) 将 CRYPEN 位设置为 1 并将 MDRST 位清除为 0 以开始接受数据。 22) 如果是最后一个明文块,可选地用零填充数据以获得一个完整的块(仅加密)。对于解密,请参阅第 *“CRYP 密文窃取和数据填充”* 节以获取更多细节。 23) 将有效载荷数据追加到加密处理器,并读取结果。三种可能的情况在第 *“执行加密操作的 CRYP 流程”* 节中描述。 24) 重复上一步,直到倒数第二个明文块被加密或最后一个密文块被解密。对于最后一个明文块(仅加密),执行前两步。对于最后一个密文块(仅解密),当最后一个块大小小于 16 字节时,驱动程序必须丢弃不属于明文的部分。一旦提供了所有有效载荷数据,等待 DONE 位标志设置后再进入下一阶段。 25) 通过清除 CRYPEN 位并通过设置 CRYP_STR 寄存器中的 MDRST 位为 1 来复位模式控制器来禁用加密处理器。 注意: 如果没有有效载荷数据,即 Plen=0 或 Clen=Tlen,则可以跳过此阶段。 注意: 解密密文 C 时,不要忘记删除 :math:`LSB_{Tlen}(C)` 加密的标签信息。 4. CCM 最终阶段 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在这最后一步中,加密处理器生成 CCM 认证标签并将其存储在输出 FIFO 中。 26) 在 CRYP_CR 中配置 GCM_CCMPH[1:0] 位为 0b11,以指示最终阶段正在进行,并在同一寄存器中将 ALGODIR 位设置为 0。 27) 将 CTR0 信息加载到 CRYP_DIN 中,该信息在表3.4 CCM 模式 IV0 寄存器初始化 中描述。 28) 等待直到 CRYP_SR 寄存器中的 OFNE 标志(FIFO 输出非空)设置为 1。 29) 读取输出 FIFO 四次:输出对应于加密的 CCM 标签。 30) 等待直到 CORE_BUSY 返回 0,禁用加密处理器(CRYP_CR 中的 CRYPEN 位设置为 0)。 31) 如果正在执行认证解密,则将生成的加密标签与密文中填充的加密标签进行比较,即 :math:`LSB_{Tlen(}C) = MSB_{Tlen}(输出 FIFO 数据)` 。 CRYP 数据寄存器和数据交换 --------------------------------------------- 简介 ~~~~~~~~~~~~~~~~~~~~~~~~ 输入到输入 FIFO 的数据最多可达四个 64 位块(TDES)或两个 128 位块(AES/SM4)的明文(加密时)或密文(解密时),每次一个 32 位字。写入 FIFO 的第一个字是输入块的最高有效位。输入块的最低有效位最后写入。当 IDATYPE="00"(无数据交换)时,数据端序可描述如下: * 在 DES/TDES 模式下 数据块的位 64(最左边的位)对应于输入 FIFO 的第一个字的最高有效位(位 63),位 0(最右边的位)对应于输入 FIFO 的第二个字的最低有效位(位 0)。 * 在 AES/SM4 模式下 数据块的位 127(最左边的位)对应于写入 FIFO 的第一个字的最高有效位(位 127),位 0(最右边的位)对应于写入 FIFO 的第 4 个字的最低有效位(位 0)。 类似地,从输出 FIFO 检索最多四个 64 位块(TDES)或两个 128 位块(AES/SM4)的明文(加密时)或密文(解密时),每次一个 32 位字。与输入数据类似,输出块的最高有效位是从输出 FIFO 读取的第一个字。输出块的最低有效位最后读取。当 DATATYPE="00"(无数据交换)时,数据端序可描述如下: * 在 DES/TDES 模式下 数据块的位 63(最左边的位)对应于从 FIFO 读取的第一个字的最高有效位(位 63),位 0(最右边的位)对应于从 FIFO 读取的第二个字的最低有效位(位 0)。 * 在 AES/SM4 模式下 数据块的位 127(最左边的位)对应于从 FIFO 读取的第一个字的最高有效位(位 127),位 0(最右边的位)对应于从 FIFO 读取的第 4 个字的最低有效位(位 0)。 DES/TDES 数据交换特性 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 根据要处理的数据类型,在进入大端 DES 处理核心之前,必须对从输入 FIFO 读取的数据执行位、字节、半字或无交换操作。相同的交换必须在大端 DES 处理核心生成的数据写入输出 FIFO 之前执行。 图 3.21 根据数据类型(输入 FIFO/输出 FIFO)构建的 64 位块,显示了 DES 处理核心的 64 位数据块 M0...63 是如何由驱动程序弹出的两个连续的 32 位字构建的。这是根据 CRYP_CR 寄存器中的 IDATYPE 和 ODATYPE 位域完成的。 注意: 在输入 FIFO 之前和输出 FIFO 之后执行相同的交换。 .. _CRYP 根据数据类型(输入 FIFO/输出 FIFO)构建的 64 位块: .. figure:: /assets/images/cryp_data_swap_64bits.png :alt: CRYP 根据数据类型(输入 FIFO/输出 FIFO)构建的 64 位块 :align: center **图 3.21: 根据数据类型(输入 FIFO/输出 FIFO)构建的 64 位块** 注意: CRYP 密钥寄存器(CRYP_Kx)和初始化寄存器(CRYP_IVx)对所选交换模式不敏感。它们具有固定配置(分别参见第 *“CRYP 密钥寄存器”* 节和第 *“初始化向量寄存器 CRYP_IV0/CRYP_IV1 配置”* 节)。 数据交换的典型示例如表3.6 DES/TDES 数据交换特性所示。 .. list-table:: 表 3.6:DES/TDES 数据交换特性 :widths: 40 20 40 :header-rows: 1 * - CRYP_CR 中的 IDATYPE/ODATYPE - 执行的交换 - 数据块表示 (64位) 0xABCD7720 6973FE01,系统内存数据(明文或密文) * - 2'b00 - 无交换 - - 地址 @: 0xABCD7720 (MSB,先写) - 地址 @+4: 0x6973FE01 * - 2'b01 - 半字(16位)交换 - - 地址 @: 0x7720ABCD (交换后的 MSB,先写) - 地址 @+4: 0xFE016973 * - 2'b10 - 字节 (8位) 交换 - - 地址 @: 0x2077CDAB (交换后的 MSB,先写) - 地址 @+4: 0x01FE7369 * - 2'b11 - 位交换 - - MSB 数据字: 0xABCD7720 0b1010 1011 1100 1101 0111 0111 0010 0000 - LSB 数据字: 0x6973FE01 0b0110 1001 0111 0011 1111 1110 0000 0001 - 地址 @: 0x04EEB3D5 (交换后的 MSB,先写) - 地址 @+4: 0x807FCE96 AES/SM4 数据交换特性 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 根据要处理的数据类型,在进入大端 AES 处理核心之前,必须对从输入 FIFO 读取的数据执行位、字节、半字或无交换操作。相同的交换必须在大端 AES 处理核心生成的数据写入输出 FIFO 之前执行。 图3.22 根据数据类型构建的 128 位块,显示了 AES 处理核心的 128 位数据块 P0..127 是如何由驱动程序写入输入 FIFO 的四个连续的 32 位字构建的。这是根据 CRYP 控制寄存器(CRYP_CR)中的 IDATYPE 位域完成的。 .. _CRYP 根据数据类型构建的 128 位块: .. figure:: /assets/images/cryp_data_swap_128bits.png :alt: CRYP 根据数据类型构建的 128 位块 :align: center **图 3.22: 根据数据类型构建的 128 位块** 注意: 交换操作涉及输入 FIFO 之前和输出 FIFO 之后。CRYP_Kx 和 CRYP_IVx 寄存器对所选交换模式不敏感。它们有配置(参见第 *“CRYP 密钥寄存器”* 节和第 *“初始化向量寄存器 CRYP_IV0/CRYP_IV1 配置”* 节)。数据交换的典型示例如表 3.7 AES/SM4 数据交换特性所示。 .. list-table:: 表 3.7:AES/SM4 数据交换特性 :widths: 40 20 40 :header-rows: 1 * - CRYP_CR 中的 IDATYPE/ODATYPE - 执行的交换 - 数据块表示 (64位) 0x4E6F7720 69732074,系统内存数据(小端) * - 2'b00 - 无交换 - - 地址 @: 0x4E6F7720 (MSB,先写) - 地址 @+4: 0x69732074 * - 2'b01 - 半字(16位)交换 - - 地址 @: 0x77204E6F (交换后的 MSB,先写) - 地址 @+4: 0x20746973 * - 2'b10 - 字节 (8位) 交换 - - 地址 @: 0x20776F4E (交换后的 MSB,先写) - 地址 @+4: 0x74207369 * - 2'b11 - 位交换 - - MSB 数据字: 0x4E6F7720 0b0100 1110 0110 1111 0111 0111 0010 0000 - LSB 数据字: 0x69732074 0b0110 1001 0111 0011 0010 0000 0111 0100 - 地址 @: 0x4EEF672 (交换后的 MSB,先写) - 地址 @+4: 0x2E04CE96 CRYP 密钥寄存器 ------------------------------ 它们被组织为八个寄存器,采用大端配置,如表 3.8 密钥寄存器 CRYP_Kx 配置(TDES K1/2/3 192位,AES 128/192/256位和 SM4 128位) 所示。 .. list-table:: 表 3.8:密钥寄存器 CRYP_Kx 配置(TDES K1/2/3 192位,AES 128/192/256位和 SM4 128位) :widths: 25 25 25 25 25 25 25 25 :header-rows: 1 * - CRYP_K0 - CRYP_K1 - CRYP_K2 - CRYP_K3 - CRYP_K4 - CRYP_K5 - CRYP_K6 - CRYP_K7 * - K1[63:32] - K1[31:0] - K2[63:32] - K2[31:0] - K3[63:32] - K3[31:0] - / - / * - CRYP_K0 - CRYP_K1 - CRYP_K2 - CRYP_K3 - CRYP_K4 - CRYP_K5 - CRYP_K6 - CRYP_K7 * - K[127:96] - K[95:64] - K[63:32] - K[31:0] - / - / - / - / * - CRYP_K0 - CRYP_K1 - CRYP_K2 - CRYP_K3 - CRYP_K4 - CRYP_K5 - CRYP_K6 - CRYP_K7 * - K[255:224] - K[223:192] - K[191:160] - K[159:128] - K[127:96] - K[95:64] - K[63:32] - K[31:0] 当选择 TDES 时(ALDO[1:0] = 01),使用三个密钥向量(K1、K2 和 K3)。当选择 DES 时(ALGO[2:0] = 00),使用单个密钥向量(K1)。 当 CRYP_SR 寄存器中的 CORE_BUSY 位设置为 1 时,对 CRYP_Kx 寄存器的任何写操作都将被忽略(即,寄存器内容不会被修改)。因此,软件在修改密钥寄存器之前必须检查 BUSY 是否等于 0。 密钥寄存器不受 CRYP_CR 寄存器中 IDATYPE/ODATYPE 值控制的数据交换特性的影响。 有关 CRYP_Kx 寄存器的详细描述,请参阅第 *“寄存器”* 节。 注意: CRYP_Kx 配置在字中是字节大端的。 例如,一个 128 位的密钥 0x00112233445566778899aabbccddeeff,配置到 CRYP_Kx 如下: CRYP_K0 == 0x00112233 CRYP_K1 == 0x44556677 CRYP_K2 == 0x8899aabb CRYP_K3 == 0xccddeeff CRYP 初始化向量寄存器 --------------------------------------------- CRYP_IVx 寄存器用于存储初始化向量或 nonce,具体取决于所选的链式模式。使用时,这些寄存器在 TDES 或 AES/SM4 核心的每个计算轮次后由核心更新。 .. list-table:: 表 3.9:初始化向量寄存器 CRYP_IV0/CRYP_IV1 配置 :widths: 25 25 25 25 25 25 :header-rows: 1 * - ALGO - MODE - CRYP_IV0_0 - CRYP_IV0_1 - CRYP_IV0_2 - CRYP_IV0_3 * - DES/TDES - CTR - IV0[63:32] - IV0[31:0] - / - / * - ALGO - MODE - CRYP_IV1_0 - CRYP_IV1_1 - CRYP_IV1_2 - CRYP_IV1_3 * - DES/TDES - CBC - IV1[63:32] - IV1[31:0] - / - / * - ALGO - MODE - CRYP_IV0_0 - CRYP_IV0_1 - CRYP_IV0_2 - CRYP_IV0_3 * - AES/SM4 - CTR - IV0[127:96] - IV0[95:64] - IV0[63:32] - IV0[31:0] * - ALGO - MODE - CRYP_IV1_0 - CRYP_IV1_1 - CRYP_IV1_2 - CRYP_IV1_3 * - AES/SM4 - CBC - IV1[127:96] - IV1[95:64] - IV1[63:32] - IV1[31:0] 当 CRYP_SR 寄存器中的 CORE_BUSY 位设置为 1 时,对 CRYP_IVx 寄存器的任何写操作都会导致处理错误。因此,软件在修改初始化向量之前必须检查 CRYP_SR 寄存器中的 BUSY 是否等于 0。 读取 CRYP_IVx 寄存器会返回最新的计数器值(对于管理挂起模式很有用),CCM/GCM 除外。 注意: CRYP_IVx 配置在字中是字节大端的。 例如,一个 128 位的 IV0 0x00112233445566778899aabbccddeeff,配置到 CRYP_IV0 如下: CRYP_IV0_0 == 0x00112233 CRYP_IV0_1 == 0x44556677 CRYP_IV0_2 == 0x8899aabb CRYP_IV0_3 == 0xccddeeff 最后剩余数据处理 ----------------------------- 如果要处理的数据包的数据字节数不是 16(128 位)的整数倍,用户应将冗余字节数配置到寄存器 CRYP_RLEN.rlen。 例如,如果数据包长度为 60 字节,用户应将 60%16 = 12 配置到寄存器 CRYP_RLEN.rlen,以告知加密处理器最后有效字节数。因此,最后一个块(128 位)的组成是 12 字节加上 4 字节的填充 0。加密或解密后,用户应只取前 12 个有效字节,丢弃最后 4 个填充字节。 CRYP DMA 接口 ----------------------------- 加密处理器提供一个接收和发送接口连接到 DMA 控制器。可以通过设置 CRYP_DMAEN 寄存器中的 CRYP_DMAEN 位来使用此 DMA 将数据写入加密处理器。当该位被设置时,每当 FIFO 中有空闲字时,加密处理器就会向 DMA 控制器发出请求信号。一旦加密处理器接收到一个字的数据以及来自 DMA 控制器的一个时钟周期的 ACK,请求信号就会被 ACK 清除,加密处理器会自动重新启动此过程,检查 FIFO 大小,并在 FIFO 状态允许至少接收一个字时发出新的请求。 使用 DMA 输入数据 ~~~~~~~~~~~~~~~~~~~~~~~ 可以通过设置 CRYP_DMAEN 寄存器中的 DIEN 位来启用 DMA,以便将数据写入加密外设。当该位被设置时,加密处理器在 INPUT 阶段期间启动 DMA 请求,每次需要向输入 FIFO 写入 4 个字时。如果最后剩余数据少于 4 个字,dma 将把实际的剩余字写入输入 FIFO。 使用 DMA 输出数据 ~~~~~~~~~~~~~~~~~~~~~~~ 要启用 DMA 以从外设读取数据,请设置 CRYP_DMAEN 寄存器中的 DOEN 位。当该位被设置时,加密处理器在 OUTPUT 阶段期间启动 DMA 请求,每次需要从输出 FIFO 读取 4 个字时。如果输出 FIFO 中的最后剩余数据少于 4 个字,加密处理器将发送最后一个请求给 dma 以获取剩余的字。 注意: 重要的是 DMA 控制器在填满 CRYP 输入 FIFO 之前清空加密外设输出 FIFO。为了实现这一点,应配置 DMA 控制器,使得从外设到内存的传输具有比从内存到外设的传输更高的优先级。 CRYP 挂起/恢复操作 ----------------------------- 如果必须处理另一条具有更高优先级的消息,则可以挂起当前消息。当这条最高优先级的消息发送完毕后,可以在加密或解密模式下恢复挂起的消息。 图 3.23 挂起模式管理示例,给出了挂起/恢复操作的示例:消息 1 被挂起以发送更高优先级的消息(消息 2),该消息比消息 1 短(AES 算法)。 .. _CRYP 挂起模式管理示例: .. figure:: /assets/images/cryp_suspend_resume.png :alt: CRYP 挂起模式管理示例 :align: center **图 3.23: 挂起模式管理示例** 如果加密处理器正在工作,挂起/恢复操作的详细描述如下: 1. 将 CRYP_CR 中的 SUSPEND 位设置为 1。 2. 读取 CRYP_SR 中的状态位 INFSTOPWR 和 NBRDY,并检查是否都为 1,如果是,则继续下一步。 3. 备份恢复所需的数据如下: - 密钥寄存器 CRYP_Kx 的内容。 - 如果 AES 算法且 keysize = 0,x = [0...3]。 - 如果 AES 算法且 keysize = 1,x = [0...5]。 - 如果 AES 算法且 keysize = 2,x = [0...7]。 - 如果 SM4 算法,x = [0...3]。 - 如果 DES 算法,x = [0,1]。 - 如果 TDES 算法,x = x = [0...5]。 - 寄存器 CRYP_IV0_x 的内容。 - 如果 AES 或 SM4 算法,且模式为 CTR GCM 或 CCM,x = [0...3]。 - 如果 DES 或 TDES 算法,且模式为 CTR,x = [0,1]。 - 寄存器 CRYP_IV1_x 的内容。 - 如果 AES 或 SM4 算法,且模式为 CBC 或 CCM,x = [0...3]。 - 如果 DES 或 TDES 算法,且模式为 CBC,x = [0,1]。 - 寄存器 CRYP_DIN_CNT 的内容。 - 寄存器 CRYP_DOUT_CNT 的内容。 - 寄存器 CRYP_GCMCCM_CTXx (x=0...3) 的内容。 - 寄存器 CRYP_IMSCR 的内容,如果配置并使用了此寄存器。 - 寄存器 CRYP_RLEN 的内容。 - 寄存器 CRYP_TH 中使用的位域的内容,包括位域:INFIFO_AFULL_TH(输入 FIFO 几乎满阈值)、OUTFIFO_AEMPTY_TH(输出 FIFO 几乎空阈值)、TO_TH(总线超时阈值)。 - 寄存器 CRYP_DMAEN 的内容,如果使用了 DMA 模式。 - 寄存器 CRYP_CR 的内容,其中 SUSPEND 被清除为 0。 - 寄存器 CRYP_STR 的内容,其中 CRYPEN 被清除为 0。 4. 将 CRYP_STR 中的 MDRST 设置为 0 以复位模式控制器。 5. 切换到处理高优先级数据,如第 *“执行加密操作的 CRYP 流程”* 节所述。 6. 通过将 FIFOFLUSH 设置为 1,然后清除它以刷新输入 FIFO 和输出 FIFO。 7. 使用已备份的值恢复除 CRYP_CR 之外的寄存器。 8. 使用已备份的值恢复寄存器 CRYP_CR。 9. 清除 MDRST 位为 0,并设置 CRYPEN 位为 1 以恢复。 CRYP EFUSE/OTP 密钥使用 ----------------------------- 加密处理器有 768 位密钥输入接口,可以分成 6 组 128 位密钥、4 组 192 位密钥或 3 组 256 位密钥。这些端口可以连接到系统的内部 efuse 或 opt。图 3.23 密钥分组示例,给出了 768 位密钥分组的示例。 .. _CRYP 密钥分组示例: .. figure:: /assets/images/cryp_key_groups.png :alt: CRYP 密钥分组示例 :align: center **图 3.23: 密钥分组示例** .. list-table:: 表 3.10:通过寄存器 CRYP_EFUSE 的 gp_sel 位域和寄存器 CRYP_CR 的 keysize 位域配置密钥分组选择 :widths: 25 25 25 25 :header-rows: 1 * - 密钥位编号 - keysize 配置 - gp_sel 配置 - 选择的密钥组 * - 128 位 - 2'b00 - 3'b000 - key0 * - 128 位 - 2'b00 - 3'b001 - key1 * - 128 位 - 2'b00 - 3'b010 - key2 * - 128 位 - 2'b00 - 3'b011 - key3 * - 128 位 - 2'b00 - 3'b100 - key4 * - 128 位 - 2'b00 - 3'b101 - key5 * - 192 位 - 2'b01 - 3'b000 - key0 * - 192 位 - 2'b01 - 3'b001 - key1 * - 192 位 - 2'b01 - 3'b010 - key2 * - 192 位 - 2'b01 - 3'b011 - key3 * - 256 位 - 2'b10 - 3'b000 - key0 * - 256 位 - 2'b10 - 3'b001 - key1 * - 256 位 - 2'b10 - 3'b010 - key2 详细信息描述请参见寄存器 CRYP 的 EFUSE 密钥选择控制。 注意: 在启用此加密处理器之前,用户必须先配置寄存器 CRYP_CR 的 keysize 位域,然后配置寄存器 CRYP_EFUSE 的 gp_sel 和 key_sel 位域,否则加密处理器无法捕获密钥。如果用户想更改一组密钥,请先禁用加密处理器,然后更改 gp_sel 并重新配置 key_sel 从 0 到 1 以捕获新选择的密钥。 CRYP 处理时间 ----------------------------- 每种操作模式下处理一个块所需的时间总结如下。 .. list-table:: 表 3.11:处理时间 :widths: 20 20 20 20 20 20 20 20 20 :header-rows: 1 * - - - 算法 - DES - TDES - SM4 - AES - AES - AES * - - - 块大小 (位) - 64 - 64 - 128 - 128 - 128 - 128 * - - - 密钥大小 (位) - 64 - 3x64 - 128 - 128 - 192 - 256 * - - - 单位 - cycle数 - cycle数 - cycle数 - cycle数 - cycle数 - cycle数 * - 模式 - 方向 - 阶段 - - - - - - * - 密钥准备 - - - - - 32 - 11 - 13 - 15 * - ECB - 加密 - - 17 - 51 - 33 - 11 - 13 - 15 * - ECB - 解密 - - 17 - 51 - 33 - 11 - 13 - 15 * - CBC - 加密 - - 18 - 52 - 34 - 12 - 14 - 16 * - CBC - 解密 - - 19 - 53 - 35 - 13 - 15 - 17 * - CTR - 加密 - - - - 33 - 11 - 13 - 15 * - CTR - 解密 - - - - 33 - 11 - 13 - 15 * - GCM - 加密 - 初始化阶段 - - - 34 - 12 - 14 - 16 * - GCM - 加密 - 头部阶段 - - - 12 - 12 - 12 - 12 * - GCM - 加密 - 有效载荷阶段 - - - 33 - 12 - 13 - 15 * - GCM - 加密 - 最终阶段 - - - 34 - 12 - 14 - 16 * - GCM - 解密 - 初始化阶段 - - - 34 - 12 - 14 - 16 * - GCM - 解密 - 头部阶段 - - - 12 - 12 - 12 - 12 * - GCM - 解密 - 有效载荷阶段 - - - 33 - 12 - 13 - 15 * - GCM - 解密 - 最终阶段 - - - 34 - 12 - 14 - 16 * - GMAC - - - - - 12 - 12 - 12 - 12 * - CCM - 加密 - 初始化阶段 - - - 34 - 12 - 14 - 16 * - CCM - 加密 - 头部阶段 - - - 34 - 12 - 14 - 16 * - CCM - 加密 - 有效载荷阶段 - - - 68 - 26 - 28 - 32 * - CCM - 加密 - 最终阶段 - - - 34 - 12 - 14 - 16 * - CCM - 解密 - 初始化阶段 - - - 34 - 12 - 14 - 16 * - CCM - 解密 - 头部阶段 - - - 34 - 12 - 14 - 16 * - CCM - 解密 - 有效载荷阶段 - - - 68 - 26 - 28 - 32 * - CCM - 解密 - 最终阶段 - - - 34 - 12 - 14 - 16 * - CMAC - - - - - 34 - 12 - 14 - 16 * - - - - - - - - - * - - - 算法 - DES - TDES - SM4 - AES - AES - AES * - - - 块大小 (位) - 64 - 64 - 128 - 128 - 128 - 128 * - - - 密钥大小 (位) - 64 - 3x64 - 128 - 128 - 192 - 256 * - - - 单位 - Gbps @100MHz - Gbps @100MHz - Gbps @100MHz - Gbps @100MHz - Gbps @100MHz - Gbps @100MHz * - 模式 - 方向 - 阶段 - - - - - - * - 密钥准备 - - - - - - - - * - ECB - 加密 - - 0.376 - 0.125 - 0.388 - 1.164 - 0.985 - 0.853 * - ECB - 解密 - - 0.376 - 0.125 - 0.388 - 1.164 - 0.985 - 0.853 * - CBC - 加密 - - 0.356 - 0.123 - 0.376 - 1.067 - 0.914 - 0.800 * - CBC - 解密 - - 0.337 - 0.121 - 0.366 - 0.985 - 0.853 - 0.753 * - CTR - 加密 - - - - 0.388 - 1.164 - 0.985 - 0.853 * - CTR - 解密 - - - - 0.388 - 1.164 - 0.985 - 0.853 * - GCM - 加密 - 初始化阶段 - - - - - - * - GCM - 加密 - 头部阶段 - - - 1.067 - 1.067 - 1.067 - 1.067 * - GCM - 加密 - 有效载荷阶段 - - - 0.388 - 1.067 - 0.985 - 0.853 * - GCM - 加密 - 最终阶段 - - - - - - * - GCM - 解密 - 初始化阶段 - - - - - - * - GCM - 解密 - 头部阶段 - - - 1.067 - 1.067 - 1.067 - 1.067 * - GCM - 解密 - 有效载荷阶段 - - - 0.388 - 1.067 - 0.985 - 0.853 * - GCM - 解密 - 最终阶段 - - - - - - * - GMAC - - - - - 1.067 - 1.067 - 1.067 - 1.067 * - CCM - 加密 - 初始化阶段 - - - - - - * - CCM - 加密 - 头部阶段 - - - 0.376 - 1.067 - 0.914 - 0.800 * - CCM - 加密 - 有效载荷阶段 - - - 0.188 - 0.492 - 0.457 - 0.400 * - CCM - 加密 - 最终阶段 - - - - - - * - CCM - 解密 - 初始化阶段 - - - - - - * - CCM - 解密 - 头部阶段 - - - 0.376 - 1.067 - 0.914 - 0.800 * - CCM - 解密 - 有效载荷阶段 - - - 0.188 - 0.492 - 0.457 - 0.400 * - CCM - 解密 - 最终阶段 - - - - - - * - CMAC - - - - - 0.376 - 1.067 - 0.914 - 0.800 硬件不直接支持 CMAC 模式。CMAC 可以在软件的帮助下计算。软件完成一小部分数据处理(例如,子密钥生成)。当数据长度与密钥长度相比足够大时,这部分时间可以忽略不计。 4. 中断 >>>>>>>>>>> 加密处理器生成五个独立的可屏蔽中断源,以指示以下事件: * CRYP 密钥准备完成(KEYPRPIS) * 输入 FIFO 不几乎满(INIS) * 输出 FIFO 不几乎空(OUTIS) * 写入输入 FIFO 总线超时(INTOIS) * 读取输出 FIFO 总线超时(OUTOIS) 这些中断源连接到同一个全局中断请求信号,如图4.1 CRYP 中断映射图所示。 .. _CRYP 中断映射图: .. figure:: /assets/images/cryp_interrupt_map.png :alt: CRYP 中断映射图 :align: center **图 4.1: CRYP 中断映射图** 可以通过更改 CRYP_IMSCR 寄存器中的使能位来单独启用或禁用上述中断源。将相应的掩码位设置为 1 可启用中断。 可以从 CRYP_RISR 或 CRYP_MISR 寄存器读取单个中断事件的状态。表4.1 Cryp 中断请求 总结了可用的功能。 .. list-table:: 表 4.1:Cryp 中断请求 :widths: 30 20 20 :header-rows: 1 * - 中断事件 - 事件标志 - 使能控制位 * - CRYP 密钥准备完成 - KEYPRPIS - KEYPRPIM * - 输入 FIFO 不几乎满 - INIS - INIM * - 输出 FIFO 不几乎空 - OUTIS - KOUTIM * - 写入输入 FIFO 总线超时 - INTOIS - INTOIM * - 读取输出 FIFO 总线超时 - OUTOIS - KOUTOIM 5. 寄存器 >>>>>>>>>>>>>> CRYP_RF 寄存器 ------------------------ 寄存器及其在 CRYP_RF 中的相应偏移量如表5.1 CRYP_RF 中寄存器的偏移地址所示。 .. list-table:: 表 5.1:CRYP_RF 中寄存器的偏移地址 :widths: 10 25 46 :header-rows: 1 * - 偏移量 - 寄存器名称 - 功能描述 * - 0x0 - IP_VER - IP 版本号 * - 0x8 - CRYP_CR - 控制寄存器 * - 0xC - CRYP_FLUSH - 输入 fifo 和输出 fifo 刷新配置 * - 0x10 - CRYP_DIN_CNT - 输入的剩余数据计数 * - 0x14 - CRYP_DOUT_CNT - 输出的剩余数据计数 * - 0x18 - CRYP_RLEN - 附加数据长度模 16 的配置 * - 0x1C - CRYP_TH - 超时阈值配置 * - 0x20 - CRYP_SR - 算法核心的忙状态 * - 0x24 - CRYP_DIN - 输入 fifo 数据 * - 0x28 - CRYP_DOUT - 加密或解密后从 fifo 出来的数据 * - 0x2C - CRYP_DMAEN - 输入/输出 fifo 填充 DMA 模式配置 * - 0x30 - CRYP_IMSCR - 中断掩码配置 * - 0x34 - CRYP_RISR - 中断状态 * - 0x38 - CRYP_MISR - 掩码后的中断状态 * - 0x3C - CRYP_CLR - 中断状态清除配置 * - 0x40 - CRYP_K0 - 密钥寄存器 * - 0x44 - CRYP_K1 - 密钥寄存器 * - 0x48 - CRYP_K2 - 密钥寄存器 * - 0x4C - CRYP_K3 - 密钥寄存器 * - 0x50 - CRYP_K4 - 密钥寄存器 * - 0x54 - CRYP_K5 - 密钥寄存器 * - 0x58 - CRYP_K6 - 密钥寄存器 * - 0x5C - CRYP_K7 - 密钥寄存器 * - 0x60 - CRYP_IV0_0 - 初始化向量 0 配置 * - 0x64 - CRYP_IV0_1 - 初始化向量 0 配置 * - 0x68 - CRYP_IV0_2 - 初始化向量 0 配置 * - 0x6C - CRYP_IV0_3 - 初始化向量 0 配置 * - 0x70 - CRYP_IV1_0 - 初始化向量 0 配置 * - 0x74 - CRYP_IV1_1 - 初始化向量 0 配置 * - 0x78 - CRYP_IV1_2 - 初始化向量 0 配置 * - 0x7C - CRYP_IV1_3 - 初始化向量 0 配置 * - 0x80 - CRYP_GCMCCM_CTX0 - GCM/CCM 模式的 Ghash 初始化向量 * - 0x84 - CRYP_GCMCCM_CTX1 - GCM/CCM 模式的 Ghash 初始化向量 * - 0x88 - CRYP_GCMCCM_CTX2 - GCM/CCM 模式的 Ghash 初始化向量 * - 0x8C - CRYP_GCMCCM_CTX3 - GCM/CCM 模式的 Ghash 初始化向量 * - 0x90 - CRYP_EFUSE - Efuse 密钥使用控制 * - 0x94 - CRYP_GPS - Efuse 密钥组选择 * - 0x98 - CRYP_STR - cryp 启动配置 IP 版本号寄存器 ~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x0`` .. list-table:: 表 5.2:IP_VER 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - IP_VER - 23:0 - 只读 - 0x010101 - IP 版本号 * - Reserved - 31:24 - / - 0x0 - / CRYP 控制寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x8`` .. list-table:: 表 5.3:CRYP_CR 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - algodir - 0 - 读/写 - 0x0 - 算法方向 加密或解密 - 1'd0: 加密 - 1'd1: 解密 * - algomode - 3:1 - 读/写 - 0x0 - 算法模式选择 - 3'b000: 解密密钥准备 - 3'b001: ECB 模式 - 3'b010: CBC 模式 - 3'b011: CTR 模式 - 3'b100: GCM 或 GMAC 模式 - 3'b101: 保留 - 3'b110: CCM 模式 * - idatype - 5:4 - 读/写 - 0x0 - 输入 fifo 的位/字节/半字交换 - 2'b00: 无交换 - 2'b01: 半字交换 - 2'b10: 字节交换 - 2'b11: 位交换 * - keysize - 7:6 - 读/写 - 0x0 - 密钥长度 - 2'b00: 密钥长度 128 位 - 2'b01: 密钥长度 192 位 - 2'b10: 密钥长度 256 位 - 2'b11: 保留 * - 保留 - 9:8 - / - 0x0 - / * - gcm_ccmph - 11:10 - 读/写 - 0x0 - GCM/CCM 阶段选择 - 2'b00: 初始化阶段 - 2'b01: 头部阶段 - 2'b10: 有效载荷阶段 - 2'b11: 最终阶段 * - algo - 13:12 - 读/写 - 0x0 - 算法选择 - 2'b00: DES 算法 - 2'b01: TDES 算法 - 2'b10: AES 算法 - 2'b11: SM4 算法 * - suspend - 14 - 读/写 - 0x0 - 挂起处理使能 - 1'd0: 不挂起 - 1'd1: 暂停处理并保持场景 * - odattype - 16:15 - 读/写 - 0x0 - 输出 fifo 的位/字节/半字交换 - 2'b00: 无交换 - 2'b01: 半字交换 - 2'b10: 字节交换 - 2'b11: 位交换 * - 保留 - 31:17 - / - 0x0 - / CRYP 输入 FIFO 和输出 FIFO 刷新 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xC`` .. list-table:: 表 5.4:CRYP_FLUSH 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - fifoflush - 0 - 读/写 - 0x0 - 输入和输出 fifo 清除使能:写入 1 刷新输入 fifo 和输出 fifo。应先写 1 然后写 0 以刷新 * - 保留 - 31:1 - / - 0x0 - / 写入 CRYP 输入 FIFO 的数据数量 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x10`` .. list-table:: 表 5.5:CRYP_DIN_CNT 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - rem_din_cnt - 31:0 - 读/写 - 0x0 - 输入的剩余数据计数 - (1) 在配置期间,用户向此寄存器写入所需的输入数据长度。 - (2) 随着处理的进行,每次写入输入数据时此计数减少单位:32 位字 从 CRYP 输出 FIFO 读取的数据数量 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x14`` .. list-table:: 表 5.6:CRYP_DOUT_CNT 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - rem_dout_cnt - 31:0 - 读/写 - 0x0 - 输出的剩余数据计数 - (1) 在配置期间,用户向此寄存器写入所需的输出数据长度。 - (2) 随着处理的进行,每次读取输出数据时此计数减少单位:32 位字 最后块的有效字节数 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x18`` .. list-table:: 表 5.7:CRYP_RLEN 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - rlen - 3:0 - 读/写 - 0x0 - 最后块的有效字节数。用于填充,单位:字节。 * - 保留 - 31:4 - / - 0x0 - / CRYP 的阈值寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x1C`` .. list-table:: 表 5.8:CRYP_TH 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - to_th - 7:0 - 读/写 - 0x0 - 超时阈值(单位:1024 周期)达到阈值时生成中断 * - outfifo_aempty_th - 10:8 - 读/写 - 0x0 - 输出 fifo 几乎空阈值 * - 保留 - 11 - / - 0x0 - / * - infifo_afull_th - 14:12 - 读/写 - 0x7 - 输入 fifo 几乎满阈值 * - 保留 - 31:15 - / - 0x0 - / CRYP 的状态寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x20`` .. list-table:: 表 5.9:CRYP_SR 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - core_busy - 0 - 只读 - 0x0 - 算法核心的忙状态 - 1'b0: 算法核心空闲。 - 1'b1: 算法核心忙。 * - done - 1 - 只读 - 0x0 - 任务完成标志 * - err_dout_longer - 2 - 只读 - 0x0 - 输出数据过长的错误标志。实际输出数据长度大于 CRYP_DOUT_CNT 指定的长度 * - err_din_longer - 3 - 只读 - 0x0 - 输入数据过长的错误标志。实际输入数据长度大于 CRYP_DIN_CNT 指定的长度 * - of_nae - 4 - 只读 - 0x0 - 输出 FIFO 不几乎空标志 * - if_naf - 5 - 只读 - 0x0 - 输入 FIFO 不几乎满标志 * - offu - 6 - 只读 - 0x0 - 输出 FIFO 满标志 * - ofne - 7 - 只读 - 0x0 - 输出 FIFO 非空标志 * - ifnf - 8 - 只读 - 0x1 - 输入 FIFO 非满标志 * - ifem - 9 - 只读 - 0x1 - 输入 FIFO 空标志 * - nbrdy - 10 - 只读 - 0x0 - 块数是块大小的整数倍 * - iflevel - 13:11 - 只读 - 0x0 - 指示输入 FIFO 中已占用的存储单元数量 * - 保留 - 14 - / - 0x0 - / * - oflevel - 17:15 - 只读 - 0x0 - 指示输出 FIFO 中已占用的存储单元数量 * - infstopwr - 18 - 只读 - 0 - 配置挂起时的输入 FIFO 停止写入标志 - 1'b0: 允许写入输入 FIFO - 1'b1: 不允许写入输入 FIFO * - 保留 - 31:19 - / - 0x0 - / CRYP 输入 FIFO 的访问地址 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x24`` .. list-table:: 表 5.10:CRYP_DIN 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - datain - 31:0 - WO - 0x0 - 加密或解密数据写入输入 FIFO。需要加密或解密的数据写入输入 FIFO,读回始终为零 CRYP 输出 FIFO 的访问地址 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x28`` .. list-table:: 表 5.11:CRYP_DOUT 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - dataout - 31:0 - 只读 - 0x0 - 加密或解密后从输出 FIFO 读取的数据 CRYP 的 DMA 使能 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x2C`` .. list-table:: 表 5.12:CRYP_DMAEN 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - doen - 0 - 读/写 - 0x0 - 输出 FIFO 填充数据 DMA 模式使能。 - 1'b0: 禁止 - 1'b1: 使能 * - dien - 1 - 读/写 - 0x0 - 输入 FIFO 填充数据 DMA 模式使能。 - 1'b0: 禁止 - 1'b1: 使能 * - 保留 - 31:2 - / - 0x0 - / CRYP 的中断掩码控制寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x30`` .. list-table:: 表 5.13:CRYP_IMSCR 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - outoim - 0 - 读/写 - 0x0 - ICB 读取超时的原始中断掩码 - 1'b0: 屏蔽中断响应 - 1'b1: 允许中断响应 * - intoim - 1 - 读/写 - 0x0 - ICB 写入超时的原始中断掩码 - 1'b0: 屏蔽中断响应 - 1'b1: 允许中断响应 * - outim - 2 - 读/写 - 0x0 - 输出 FIFO 的原始中断掩码 - 1'b0: 屏蔽中断响应 - 1'b1: 允许中断响应 * - inim - 3 - 读/写 - 0x0 - 输入 FIFO 的原始中断掩码 - 1'b0: 屏蔽中断响应 - 1'b1: 允许中断响应 * - keyprpim - 4 - 读/写 - 0x0 - 密钥准备完成的原始中断掩码 - 1'b0: 屏蔽中断响应 - 1'b1: 允许中断响应 * - 保留 - 31:5 - / - 0x0 - / CRYP 的中断状态寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x34`` .. list-table:: 表 5.14:CRYP_RISR 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - outoris - 0 - 只读 - 0x0 - ICB 读取超时的原始中断 * - intoris - 1 - 只读 - 0x0 - ICB 写入超时的原始中断 * - outris - 2 - 只读 - 0x0 - 输出 FIFO 的原始中断。与 CRYP_SR.OF_NAE 相同 * - inris - 3 - 只读 - 0x1 - 输入 FIFO 的原始中断。与 CRYP_SR.IF_NAF 相同 * - keyprpis - 4 - 只读 - 0x0 - 密钥准备完成的原始中断 * - 保留 - 31:5 - / - 0x0 - / CRYP 的掩码后中断状态 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x38`` .. list-table:: 表 5.15:CRYP_MISR 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - outomis - 0 - 只读 - 0x0 - 输出 FIFO ICB 超时后的原始中断(掩码后) * - intomis - 1 - 只读 - 0x0 - 输入 FIFO ICB 超时后的原始中断(掩码后) * - outmis - 2 - 只读 - 0x0 - 输出 FIFO 不几乎空后的原始中断(掩码后) * - inmis - 3 - 只读 - 0x0 - 输入 FIFO 不几乎满后的原始中断(掩码后) * - keyprpmis - 4 - 只读 - 0x0 - 密钥准备完成后的原始中断(掩码后) * - 保留 - 31:5 - / - 0x0 - / CRYP 的中断状态清除 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x3C`` .. list-table:: 表 5.16:CRYP_CLR 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - dout_tout - 0 - 写1清0 - 0x0 - 输出 FIFO 总线请求超时清除。只写,读回始终为 0 * - din_tout - 1 - 写1清0 - 0x0 - 输入 FIFO 总线请求超时清除。只写,读回始终为 0 * - err_dout - 2 - 写1清0 - 0x0 - 实际输出数据过长的错误标志状态清除。只写,读回始终为 0 * - err_din - 3 - 写1清0 - 0x0 - 实际输入数据过长的错误标志状态清除。只写,读回始终为 0 * - keyprpic - 4 - 写1清0 - 0x0 - 密钥准备完成中断清除 * - 保留 - 31:5 - / - 0x0 - / CRYP 的密钥寄存器0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x40`` .. list-table:: 表 5.17:CRYP_K0 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k0 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的密钥寄存器1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x44`` .. list-table:: 表 5.18:CRYP_K1 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k1 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的密钥寄存器2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x48`` .. list-table:: 表 5.19:CRYP_K2 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k2 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的密钥寄存器3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x4C`` .. list-table:: 表 5.20:CRYP_K3 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k1 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的密钥寄存器4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x50`` .. list-table:: 表 5.21:CRYP_K4 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k4 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的密钥寄存器5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x54`` .. list-table:: 表 5.22:CRYP_K5 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k5 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的密钥寄存器6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x58`` .. list-table:: 表 5.23:CRYP_K6 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k6 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的密钥寄存器7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x5C`` .. list-table:: 表 5.24:CRYP_K7 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - k7 - 31:0 - 读/写 - 0x0 - 加密或解密的密钥 CRYP 的初始化向量 0(CRYP_IV0_0 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x60`` .. list-table:: 表 5.25:CRYP_IV0_0 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv0_0 - 31:0 - 读/写 - 0x0 - CTR 或 CCM 或 GCM 模式的 iv CRYP 的初始化向量 0(CRYP_IV0_1 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x64`` .. list-table:: 表 5.26:CRYP_IV0_1 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv0_1 - 31:0 - 读/写 - 0x0 - CTR 或 CCM 或 GCM 模式的 iv CRYP 的初始化向量 0(CRYP_IV0_2 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x68`` .. list-table:: 表 5.27:CRYP_IV0_2 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv0_2 - 31:0 - 读/写 - 0x0 - CTR 或 CCM 或 GCM 模式的 iv CRYP 的初始化向量 0(CRYP_IV0_3 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x6C`` .. list-table:: 表 5.28:CRYP_IV0_3 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv0_3 - 31:0 - 读/写 - 0x0 - CTR 或 CCM 或 GCM 模式的 iv CRYP 的初始化向量 1(CRYP_IV1_0 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x70`` .. list-table:: 表 5.29:CRYP_IV1_0 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv1_0 - 31:0 - 读/写 - 0x0 - CBC iv 或 GCM_H 或 CCM_tag CRYP 的初始化向量 1(CRYP_IV1_1 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x74`` .. list-table:: 表 5.30:CRYP_IV1_1 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv1_1 - 31:0 - 读/写 - 0x0 - CBC iv 或 GCM_H 或 CCM_tag CRYP 的初始化向量 1(CRYP_IV1_2 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x78`` .. list-table:: 表 5.31:CRYP_IV1_2 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv1_2 - 31:0 - 读/写 - 0x0 - CBC iv 或 GCM_H 或 CCM_tag CRYP 的初始化向量 1(CRYP_IV1_3 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x7C`` .. list-table:: 表 5.32:CRYP_IV1_3 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - iv1_3 - 31:0 - 读/写 - 0x0 - CBC iv 或 GCM_H 或 CCM_tag CRYP 的 GCM 或 CCM TAT 备份(CRYP_GCMCCM_CTX0 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x80`` .. list-table:: 表 5.33:CRYP_GCMCCM_CTX0 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ctx0 - 31:0 - 读/写 - 0x0 - ghash iv .et 读回备份,仅挂起时使用,通用寄存器 CRYP 的 GCM 或 CCM TAT 备份(CRYP_GCMCCM_CTX1 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x84`` .. list-table:: 表 5.34:CRYP_GCMCCM_CTX1 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ctx1 - 31:0 - 读/写 - 0x0 - ghash iv .et 读回备份,仅挂起时使用,通用寄存器 CRYP 的 GCM 或 CCM TAT 备份(CRYP_GCMCCM_CTX2 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x88`` .. list-table:: 表 5.35:CRYP_GCMCCM_CTX2 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ctx2 - 31:0 - 读/写 - 0x0 - ghash iv .et 读回备份,仅挂起时使用,通用寄存器 CRYP 的 GCM 或 CCM TAT 备份(CRYP_GCMCCM_CTX3 寄存器) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x8C`` .. list-table:: 表 5.36:CRYP_GCMCCM_CTX3 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ctx3 - 31:0 - 读/写 - 0x0 - ghash iv .et 读回备份,仅挂起时使用,通用寄存器 CRYP 的 EFUSE 密钥选择控制 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x90`` .. list-table:: 表 5.37:CRYP_EFUSE 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - key_sel - 0 - 读/写 - 0x0 - 密钥选择。必须先配置 gp_sel,然后配置 key_sel - 1'b0: 使用软件配置的密钥 - 1'b1: 使用 efuse 密钥 * - 保留 - 31:1 - / - 0x0 - / EFUSE 密钥组选择 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x94`` .. list-table:: 表 5.38:CRYP_GPS 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - 保留 - 3:0 - / - 0x0 - / * - gp_sel - 6:4 - 读/写 - 0x0 - 密钥组选择 - 3'b000: 选择 768 位中的第 0 组 128/192/256 密钥 - 3'b001: 选择 768 位中的第 1 组 128/192/256 密钥 - 3'b010: 选择 768 位中的第 2 组 128/192/256 密钥 - 3'b011: 选择 768 位中的第 3 组 128/192 密钥 - 3'b100: 选择 768 位中的第 4 组 128 密钥 - 3'b101: 选择 768 位中的第 5 组 128 密钥 * - 保留 - 31:7 - / - 0x0 - / CRYP 启动 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x98`` .. list-table:: 表 5.39:CRYP_STR 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - modrst - 0 - 读/写 - 0x0 - 模式控制模块软复位 - 1'b0: 释放初始复位 - 1'b1: 初始复位 * - 保留 - 3:1 - / - 0x0 - / * - crypen - 4 - 读/写 - 0x0 - 加密和解密使能 - 1'b0: 禁用加密或解密 - 1'b1: 启用加密或解密 * - 保留 - 31:5 - / - 0x0 - /