.. _ip_ls_intf_hash: HASH ========= 1. 简介 >>>>>>> 该哈希处理器(HASH)完全兼容安全哈希算法(SHA-1、SHA-224、SHA-256、SHA-384、SHA-512)、MD5(消息摘要算法5)和SM3哈希算法以及HMAC(基于密钥的哈希消息认证码)算法,适用于多种应用。HMAC适用于需要消息认证的应用。 哈希处理器计算符合 FIPS(联邦信息处理标准)或 SM3 的 160、224、256、384、512 位长度的摘要。它还计算 MD5 算法的 128 位摘要。 2. 主要特性 >>>>>>>>>>> HASH 的主要特性如下: * 适用于数据认证应用,符合: - 支持联邦信息处理标准出版物 FIPS PUB 180-4,安全哈希标准(SHA-1 和 SHA-2 系列) - 支持互联网工程任务组 (IETF) 征求意见稿 RFC 1321 MD5 消息摘要算法 - 支持互联网工程任务组 (IETF) 征求意见稿 RFC 2104 HMAC:基于密钥的哈希用于消息认证,以及联邦信息处理标准出版物 FIPS PUB 198-1,基于密钥的哈希消息认证码 (HMAC) - 支持国家秘密 SM3 标准的数字签名和验证 * 来自连续消息块的摘要的相应 32 位字相互相加,形成整个消息的摘要。 * 自动进行 32 位字交换,以符合输入位串的内部小端表示法。 * 支持字交换:位、字节、32 位字的半字。 * 自动填充,以完成输入位串,使其适应 512 位(16 x 32 位)或 1024 位(32 x 32 位)的最小摘要块大小。 * SHA-1、SHA-224、SHA-256、SHA-384、SHA-512、SM3 和 MD5 的快速计算: - 使用 SHA-1 算法处理一个 512 位数据块需要 59 个时钟周期 - 使用 SHA-224、SHA-256 或 SM3 算法处理一个 512 位数据块需要 51 个时钟周期 - 使用 MD5 算法处理一个 512 位数据块需要 51 个时钟周期, - 使用 SHA-384 或 SHA-512 算法处理一个 1024 位数据块需要 75 个时钟周期。 * 从设备,仅可通过 32 位字访问。 * 16 x 32 位字(H0 到 H15)用于输出消息摘要。 * 具有支持直接存储器访问 (DMA) 的自动数据流控制,使用一个通道,支持 4 字突发传输。 * 可中断的消息摘要计算,基于块(512 位或 1024 位): - 可重载的摘要寄存器 - 哈希计算挂起/恢复机制,包括使用 DMA * 一个内部输入 FIFO - FIFO 宽度为 32 位 - FIFO 深度为 32 3. 功能描述 >>>>>>>>>>> HASH 包含两个主要单元(见图3.1 HASH 框图)。系统到 HASH 处理器仅通过一条总线连接,寄存器配置和消息使用同一条总线;在 DMA 模式下也使用同一条总线。 控制和状态寄存器位于 config_rf 模块中,用户应首先根据寄存器描述配置这些寄存器,然后输入消息直到检测到哈希完成中断状态。然后从 config_rf 模块的寄存器中获取摘要,即为结果。消息通过 fifo_ctrl 输入到 infifo。如果 infifo 不为空,hmac_hash_pre 则从 infifo 取数据到 round_ctrl,如果满足一个块大小的数据,则开始迭代计算摘要。用户可以通过寄存器配置选择迭代哈希函数。如果用户配置了 DMA 模式,dma_intf 会向 DMA 控制器发送写请求(tx),如果 DMA 控制器收到请求,它会向 infifo 写入数据(tx),并向 HASH 处理器回复一个确认(ack)和数据。如果 HASH 处理器收到 ack,请求将被清除,直到下一个请求。 注意:由于只有一个 infifo 用于消息输入,DMA 仅支持向 infifo 写入数据(tx)。 .. _HASH 框图: .. figure:: /assets/images/hash_block.png :alt: HASH 框图 :align: center **图 3.1: HASH 框图** 整个 IP 设计为同步,因此只有一个时钟,与系统时钟一致 关于安全哈希算法 ---------------------- HASH 处理器完全兼容 FIPS PUB 180-4 标准定义的以及 IETF RFC1321 出版物(MD5)定义的安全哈希算法,以及 SM3 密码算法。对于每种算法,HASH 计算消息或数据文件的压缩表示。更具体地说,当为 SHA-1、SHA-224、SHA-256 或 MD5 提供长度低于 :math:`2^{64}` 位的消息作为输入,以及为 SHA-384 或 SHA-512 提供长度低于 :math:`2^{128}` 位的消息作为输入时。SHA-1、SHA-224、SHA-256、SM3、MD5、SHA384 和 SHA512 处理核心分别产生一个 160 位、224 位、256 位、256 位、128 位、384 位和 512 位的输出字符串,称为消息摘要。消息摘要可以用数字签名算法处理,以生成或验证消息的签名。对消息摘要进行签名而不是对消息本身进行签名通常可以提高流程效率,因为消息摘要的大小通常比消息小得多。数字签名的验证者必须使用与数字签名创建者相同的哈希算法。哈希处理器支持的SHA-2或SM3函数被认定为“安全”,因为从计算角度而言,找到与给定消息摘要对应的消息是不可能的。(SHA-1 自 2017 年 2 月起不再被认定为安全),或者找到两个产生相同消息摘要的不同消息。对传输中的消息的任何更改都将极大概率导致不同的消息摘要,并且签名将验证失败。 消息数据输入 ---------------------------------- 要由 HASH 处理的消息应被视为一个位串。此消息位串从右向左增长,十六进制字以“小端”约定表示,因此在每个字内,最高有效位存储在最高位位置。例如消息字符串 "abc" 的位串表示为 "01100001 01100010 01100011",由 32 位字 0x00616263 表示。数据根据要处理的数据类型(例如,当数据是 ASCII 文本流时进行字节交换)在进入输入 fifo 之前,必须对数据执行位、字节、半字或不交换操作。图3.2 消息数据交换特性 显示了根据 HASH 控制寄存器 (CTRL) 中的 DATATYPE 位域,哈希处理核心 32 位数据块 M0…31 是如何由驱动程序推送到 IN FIFO 的一个 32 位字构建的。当禁用位交换时(DATATYPE="00")输入数据的字节序可以描述如下:消息的最低有效位必须位于输入 HASH 处理器的第一个字的 LSB 位置,位串的第 32 位必须位于输入 HASH 处理器的第二个字的 LSB 位置,依此类推。 .. _HASH 消息数据交换特性: .. figure:: /assets/images/hash_data_swap.png :alt: HASH 消息数据交换特性 :align: center **图 3.2: HASH 消息数据交换特性** 消息摘要计算 ---------------------------------- HASH 处理器在计算消息摘要时顺序处理 512 位/1024 位块。如果 HASH 处理器启用配置,它将输出数据请求,然后 DMA 或 CPU 向 HASH 处理器写入数据。每次根据所选算法,如果有 16 × 32 位/32 × 32 位字(= 512 位/1024 位)被写入 HASH 处理器,HASH 会自动开始计算消息摘要。此操作称为“部分摘要计算”。如第 *“消息数据输入”* 节所述,要处理的消息一次以 32 位字输入 HASH,写入输入 FIFO。为了对此数据执行哈希计算,应用程序应使用以下顺序。 1. 使用 CTRL 寄存器初始化 HASH 处理器: - 使用 ALGO 字段选择正确的算法。如果需要,使用 CTRL 中的 DATA_TYPE 位域对消息输入字进行正确的交换操作编程。 - 如果选择 dma 模式,则设置 DMAEN=1。 - 如果当前数据是处理的第一个段,则设置 FST_SEG=1,此位由硬件自动清零。 - 如果当前数据是处理的最后一段,则设置 LAST=1。 **注意** 如果当前数据既是第一段也是最后一段,则必须同时将 FST_SEG 和 LAST 设置为 1。 2. 使用 INT_ENB 寄存器设置中断使能: - 设置 HSHIE=1 以在最终摘要计算完成时启用中断(若非查询方法)。 - 设置 FIFOREQIE=1 以启用写 fifo 请求中断(若非查询方法或 DMA 模式)。 - 设置 OVFLWIE=1 以启用 fifo 满中断(若非查询方法且需要使用)。 - 设置 UNDFLWIE=1 以启用 fifo 空中断(若非查询方法且需要使用)。 - 设置 TOUTIE=1 以启用总线超时中断(若非查询方法)。 - 设置 DLENIE=1 以启用数据长度错误中断(若非查询方法)。 - 设置 SEGIE=1 以启用一个段消息计算完成中断(若非查询方法)。 - 设置 OPADIE=1 以启用 hmac opad 中断(若非查询方法)。 3. 使用 CALCLEN 寄存器配置数据长度(字节数): - 然后将要处理的当前段消息的一个字长度写入寄存器 CALCLEN。当 HASH 处理器启用,并且一旦当前段消息处理完毕,如果有下一段消息要处理,用户应为此寄存器写入新的段消息长度。 4. 使用 TOTLENx(对于 1024 位块大小,x=0~3;对于 512 位块大小,x=0~1)寄存器配置数据长度(字节数): - 如果消息是 32 x 32 位(1024 位)(例如选择 SHA384 或 SHA512),则首先将总消息长度(单位:字节)的 4 个字写入寄存器 TOTLEN0、TOTLEN1、TOTLEN2 和 TOTLEN3,或者如果消息是 16 x 32 位(512 位),则将总消息长度(单位:字节)的 2 个字写入 TOTLEN0、TOTLEN1。 注意: 总数据包长度应在最后一个段消息哈希计算启用之前配置,因为最后一个块的填充需要总数据包长度。 5. 通过向 SFT_INI 中的 IP_INIT 位域写入 1 来完成初始化。 6. 通过将 CTRL 中的 HSH_HMC_EN 位域设置为高电平来启用 HASH 处理器。 7. 通过写入输入 fifo 开始填充数据,除非数据是通过 DMA 自动传输的。 a. 当数据由软件填充时: - 将数据写入输入 fifo,如果通过中断或查询方法发现输入 fifo 写请求。 - 如果通过中断或查询方法发现输入 fifo 满,则停止向输入 fifo 写入数据。 b. 当数据由 DMA 填充时: - DMA 接口将向系统的 DMA 控制器输出 tx_dma_reg,然后 DMA 通过总线向 fifo 写入 4 个字的数据,并回复 tx_dma_ack 给 dma 接口以清除请求,直到下一个 tx_dma_reg。如果传输的数据字长度满足硬件从 fifo 读取的数据长度,HASH 处理器将停止触发 tx_dma_ack 给 DMA。 8. 一旦计算完成,硬件会将 INT_STA 中的 HSHINT 设置为 1,如果该位被设置,则可以从输出寄存器读取摘要,如表3.1 HASH 处理器输出 所述。 注意: 如果使用中断,软件查询寄存器 STA_MSK 中的 HSHINTMSK 位域,以查询中断使能状态。 .. list-table:: 表 3.1:HASH 处理器输出 :widths: 20 25 25 25 :header-rows: 1 * - 算法 - 有效输出寄存器 - 最高有效位 - 摘要大小(位) * - MD5 - H0_reg 到 H3_reg - H0_reg[31] - 128 * - SHA-1 - H0_reg 到 H4_reg - H0_reg[31] - 160 * - SHA-224 - H0_reg 到 H6_reg - H0_reg[31] - 224 * - SHA-256 - H0_reg 到 H7_reg - H0_reg[31] - 256 * - SHA-384 - H0_reg 到 H11_reg - H0_reg[31] - 384 * - SHA-512 - H0_reg 到 H15_reg - H0_reg[31] - 512 * - SM3 - H0_reg 到 H7_reg - H0_reg[31] - 256 消息填充 ---------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当计算消息的压缩表示时,向 HASH 处理器输入数据的过程(每 512 位/1024 位块自动进行部分摘要计算)循环进行,直到原始消息的最后字节被写入输入 fifo。由于消息的长度(字节数)可以是任何整数值,最后一个有效的字节数可以根据总消息长度由硬件自动确定。以便在最终消息摘要计算之前正确执行消息填充。 填充处理 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 消息由硬件根据消息的总长度自动填充,在最后一个段消息的最后一个 512 位块或 1024 位块写入输入 fifo 之后。如果最后一个段数据长度为零,软件应先将 LAST 位域设置为 1,然后将寄存器 CALCLEN 配置为 0,硬件会自动添加一个额外的填充块进行哈希轮次计算。 填充示例 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 假设原始消息是 "abc" 的 ASCII 二进制编码形式,长度 L = 24: byte0 byte1 byte2 byte3 01100001 01100010 01100011 UUUUUUUU <– 写入的第一个字 –> 值 24 将被加载到寄存器 TOTLEN0 到 TOTLEN1(块大小 512 位)或 TOTLEN0 到 TOTLEN3(块大小 1024 位),通过写入输入 fifo,如第 *“消息摘要计算”* 节所述:在位串的位置 24(从上述位串中从左到右计数)追加一个“1”,这对应于输入 fifo 中的第 31 位(小端约定): 01100001 01100010 01100011 1UUUUUUU 由于 L = 24,上述位串的位数为 25,并追加了 423 个“0”位,现在变成 448 位。以十六进制表示(大端格式的字节字): 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 以两字格式(即 00000000 00000018)追加消息长度值 L。 因此,最终的填充消息以十六进制表示(大端格式的字节字): 61626380 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000018 如果 HASH 处理器被编程为交换字节(CTRL 中的 DATATYPE=10),则必须按以下顺序输入上述消息: 1. 总长度低字 0x00000018 写入 TOTLEN0 寄存器。 2. 总长度高字 0x00000000 写入 TOTLEN1 寄存器。 3. 当前段长度 0x00000018 写入 CALCLEN 寄存器。 4. 0xUU636261 写入输入 fifo(其中 "U" 表示无关)。 5. 0xC40 写入 CTRL 寄存器以开始消息填充(如上所述),然后执行摘要计算。 6. 哈希计算完成,消息摘要在 Hx_reg 寄存器(x = 0...4)中可用,用于 SHA-1 算法。对于此示例,期望值如下: - H0_reg = 0xA9993E36 - H1_reg = 0x4706816A - H2_reg = 0xBA3E2571 - H3_reg = 0x7850C26C - H4_reg = 0x9CD0D89D HMAC 操作 ---------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~ 如互联网工程任务组 RFC2104 所规定,HMAC:用于消息认证的基于密钥的哈希,HMAC 算法用于消息认证,通过将正在处理的消息与用户选择的密钥不可逆地绑定。该算法包括两个嵌套的哈希操作: HMAC(消息) = Hash((密钥 | 填充) XOR [0x5C]n | Hash((密钥 | 填充) XOR [0x36]n | 消息)) * [X]n 表示 X 重复 n 次,其中 n 等于底层哈希函数数据块的大小,对于 SHA-1、SHA224、SHA-256、MD5、SM3 哈希算法为 512 位(即 n=64),对于 SHA-384、SHA-512 哈希算法为 1024 位(即 n=128)。 * 填充是将密钥扩展到上述定义的 n 长度所需的零序列。如果密钥长度大于 n,应用程序应首先使用哈希函数对密钥进行哈希处理,然后使用结果字节串作为 HMAC 的实际密钥。 HMAC 处理 ~~~~~~~~~~~~~~~~~~~~ 计算 HMAC 需要四个不同的步骤: 1. 向 SFT_INI 中的 IP_INIT 位域写入 1 以初始化 HASH 处理器。 2. 除了第 *“消息摘要计算”* 节的步骤 1 配置外,将 CTRL 寄存器中的 MODE 位域写入 1,DMAEN 保持为 0。 3. 通过将 CTRL 中的 HSH_HMC_EN 位域设置为高电平来启用 HASH 处理器。 4. 如果密钥需要交换,则配置 CTRL 寄存器的 DATATYPE 位域,否则将 CTRL 寄存器的 DATATYPE 位域保持为“00”。 5. 按照第 *“消息摘要计算”* 节的步骤 7 通过软件填充密钥的方式配置密钥。 6. 按照第 *“消息摘要计算”* 节的步骤 7 加载消息。 7. 检查寄存器 INT_STA 中的 OPADINT 位域,或者如果 OPADIE 设置为 1(中断使能),则检查寄存器 STA_MSK 中的 OPADINTMSK 位域,如果两个位中的任何一个为高电平,则表明整个数据包消息的哈希计算已完成。 8. 如果密钥需要交换,则配置 CTRL 寄存器的 DATATYPE 位域,否则保持或配置 CTRL 寄存器的 DATATYPE 位域为“00”。 9. 按照第 *“消息摘要计算”* 节的步骤 7 通过软件填充密钥的方式配置密钥。 10. 在最终的哈希轮次之后,HASH 处理器将 INT_STA 中的 HSHINT 返回高电平,以指示 HMAC 结果已就绪,可以在 H0_reg…H7_reg 或 H0_reg…H15_reg 寄存器中找到。 注意: 1. 如果使用中断,软件查询寄存器 STA_MSK 中的 OPADINTMSK 或 HSHINTMSK 位域,以查询中断使能状态,这可以屏蔽其他状态的干扰。 2. HMAC 原语的计算延迟取决于密钥和消息的长度,如第 *“HASH 处理时间”* 节所述。 HMAC 示例 ~~~~~~~~~~~~~~~~~~~~ 下面是 HMAC SHA-1 算法的一个示例(CTRL 中的 ALGO="000" 和 MODE="1")。假设原始消息是 "Sample message for keylen=blocklen" 的 ASCII 二进制编码形式,长度 L = 34 字节。如果 HASH 编程为无交换模式(CTRL 中的 DATATYPE=00),则必须将以下数据顺序加载到输入 fifo 中: 1. 当前数据长度 0x00000022 写入输入寄存器 CALCLEN。 2. 总数据长度低 32 位 0x00000022 和高 32 位 0x00000000 写入寄存器 TOTLEN0 和 TOTLEN1。 3. 0xC60 写入 CTRL 寄存器以开始消息填充并执行摘要计算。 4. 内部哈希密钥(长度=64 字节,即无需填充)输入到 fifo:00010203 04050607 08090A0B 0C0D0E0F 10111213 14151617 18191A1B 1C1D1E1F 20212223 24252627 28292A2B 2C2D2E2F 30313233 34353637 38393A3B 3C3D3E3F 5. 消息(长度=34,即需要填充)输入到 fifo:53616D70 6C65206D 65737361 67652066 6F72206B 65796C65 6E3D626C 6F636B6C 656EUUUU 6. 检查 HASH 处理器是否在 INT_STA 中将 OPADINT 返回高电平。 7. 外部哈希密钥输入,一个与内部哈希密钥相同的密钥。 8. 然后由 HASH 执行最终的外部哈希计算。HMAC SHA-1 摘要结果在 Hx_reg 寄存器(x = 0...4)中可用,如下所示:H0_reg = 0x5FD596EE H1_reg = 0x78D5553C H2_reg = 0x8FF4E72D H3_reg = 0x266DFD19 H4_reg = 0x2366DA29 挂起与恢复 ---------------------------------- 概述 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 可以中断哈希/HMAC 操作以执行另一个优先级更高的处理。中断的进程在更高优先级的任务处理完毕后稍后完成,如图3.3 HASH 保存/恢复机制 所示。 .. _HASH AES/SM4-ECB 模式概述: .. figure:: /assets/images/hash_suspend_resume.png :alt: HASH HASH 保存/恢复机制 :align: center **图 3.3: HASH 保存/恢复机制** 为此,必须将中断任务的上下文从 HASH 寄存器保存到内存,然后从内存恢复到 HASH 寄存器。 下面描述数据流由软件或 DMA 控制的流程。 软件加载数据 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当不使用 DMA 将消息加载到 HASH 处理器时,仅当没有块处理正在进行时才能保存上下文。这意味着用户应用程序必须等待,直到在 CTRL 中将 SUSPEND 设置为高电平后,SYS_STA 中的 BLKRDY = 1(一个块大小的消息处理完成且没有收到新的消息数据)。详细流程描述如下。 * 当前上下文保存,在中断当前消息摘要计算之前,应用程序必须将以下寄存器的内容存储到内存中: - CTRL(SUSPEND 位域和 HSH_HMC_EN 位域清零为 0) - INT_ENB - BLKC - CALCLEN - TOTLENx(对于 1024 位块大小,x=0~3;对于 512 位块大小,x=0~1) - H0 到 H7(512 位块)或 H0 到 H15(1024 位块) * 当前上下文恢复,要恢复处理被中断的消息,应用程序必须遵循以下步骤: a. 向 SFT_INI 中的 IP_INIT 位域写入 1 以初始化 HASH 处理器。 b. 用保存在内存中的值写入 H0 到 H7(512 位块)或 H0 到 H15(1024 位块)寄存器。 c. 用保存在内存中的值写入以下寄存器:INT_ENB、BLKC、CALCLEN 和 TOTLENx(对于 1024 位块大小,x=0~3;对于 512 位块大小,x=0~1)。 d. 用保存在内存中的值写入 CTRL 寄存器,并将 RESUME 设置为 1 以从中断点重新开始处理。 DMA 加载数据 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 当使用 DMA 将消息加载到 HASH 处理器时,无法预测 DMA 传输是否正在进行。用户应用程序必须等待,直到在 CTRL 中将 SUSPEND 设置为高电平后,SYS_STA 中的 BLKRDY = 1(一个块大小的消息处理完成且没有收到新的消息数据),然后才能中断当前的消息摘要计算。详细流程描述如下。 * 当前上下文保存 在使用 DMA 中断当前消息摘要计算之前,应用程序必须遵循以下步骤: a. 将 CTRL 中的 DMAEN 位域和 HSH_HMC_EN 位域清零为 0,然后将 CTRL 寄存器保存到内存。 b. 将寄存器:INT_ENB、BLKC、H0 到 H7(512 位块)或 H0 到 H15(1024 位块)、CALCLEN 和 TOTLENx(对于 1024 位块大小,x=0~3;对于 512 位块大小,x=0~1)保存到内存。 * 当前上下文恢复 要使用 DMA 恢复处理被中断的消息,应用程序必须遵循以下步骤: a. 向 SFT_INI 中的 IP_INIT 位域写入 1 以初始化 HASH 处理器。 b. 用保存在内存中的值写入 H0 到 H7(512 位块)或 H0 到 H15(1024 位块)寄存器。 c. 用保存在内存中的值写入以下寄存器:INT_ENB、BLKC、CALCLEN 和 TOTLENx(对于 1024 位块大小,x=0~3;对于 512 位块大小,x=0~1)。 d. 用保存在内存中的值写入 CTRL 寄存器,并将 DMAEN 位域设置为 1 以启用 DMA 模式。 e. 用保存在内存中的值写入 CTRL 寄存器,并将 RESUME 位域设置为 1 以从中断点重新开始处理。 **注意:** * 如果上下文交换不涉及 SHA384 或 SHA512 操作,则无需保存和恢复 H8_reg 到 H15_reg 寄存器。如果配置了挂起并接收到当前段哈希计算完成标志,在更高优先级的哈希计算完成后,软件不应配置恢复,启动新的段流程是正确的。 * 与其他哈希算法不同,对于 MD5,备份或恢复 H0 ~ H7 时需按 word 进行大小端转换。 HASH DMA 接口 ----------------------------- HASH 处理器提供了一个接口来连接到 DMA 控制器。通过设置 CTRL 寄存器中的 DMAEN 位,可以使用此 DMA 向 HASH 写入数据。当此位被设置时,当 FIFO 中有 4 个空闲字时,HASH 会向 DMA 控制器发出请求信号。一旦 HASH 接收到 DMA 控制器的 4 个字数据和一个时钟周期的 ACK,请求信号将被 ACK 清除,HASH 自动重新启动此过程,检查 FIFO 大小,如果 FIFO 状态允许至少接收 4 个字,则发出新的请求。 HASH 处理时间 ------------------- 表 3.2 处理时间(时钟周期)总结了每种操作模式下处理一个 512 位/1024 位中间块所需的时间。 .. list-table:: 表 3.2:处理时间(时钟周期) :widths: 25 20 20 25 :header-rows: 1 * - 操作模式 - FIFO 加载 - 计算阶段 - 总计 * - MD5 - 16 - 35 - 51 * - SHA-1 - 16 - 43 - 59 * - SHA-224 - 16 - 35 - 51 * - SHA-256 - 16 - 35 - 51 * - SM3 - 16 - 35 - 51 * - SHA-384 - 32 - 43 - 75 * - SHA-512 - 32 - 43 - 75 **注意** 必须将此值加上将块的 16/32 个字加载到处理器所需的时间。 4. 中断 >>>>>>>>>>> 哈希处理器产生七个独立的可屏蔽中断源,用于指示以下事件: * HASH 计算完成 (HSHINT) * Fifo 写请求 (FIFOREQINT) * Fifo 满 (OVRELWINT) * Fifo 空 (UNDFLWINT) * Fifo 请求数据超时 (TOUTINT) * 在开始向输入 fifo 写入段数据时,HASH 开始工作,检测到段数据长度=0 (DLENINT) * 一个段数据 HASH 计算完成 (SEGINT) 这些中断源连接到同一个全局中断请求信号,如图 4.1 HASH 中断映射图 所示。 .. _HASH 中断映射图: .. figure:: /assets/images/hash_interrupt_map.png :alt: HASH 中断映射图 :align: center **图 4.1: HASH 中断映射图** 上述中断源可以通过更改 INT_ENB 寄存器中的使能位来单独启用或禁用。将相应的使能位设置为 1 启用中断。 各个中断事件的状态可以从 INT_STA 或 STA_MSK 寄存器读取。表 4.1 Hash 中断请求 总结了可用特性。 .. list-table:: 表 4.1:Hash 中断请求 :widths: 30 20 20 :header-rows: 1 * - 中断事件 - 事件标志 - 使能控制位 * - HASH 计算完成 - HSHINT - HSHIE * - Fifo 写请求 - FIFOREQINT - FIFOREQIE * - Fifo 满 - OVRFLWINT - OVRFLWIE * - Fifo 空 - UNDFLWINT - UNDFLWIE * - Fifo 请求数据超时 - TOUTINT - TOUTIE * - 段数据长度错误 - DLENINT - DLENIE * - 一个段数据 HASH 计算完成 - SEGINT - SEGIE 5. 寄存器 >>>>>>>>>>>>>> HASH_RF 寄存器 ------------------------ 寄存器和它们在 HASH_RF 中的相应偏移量如表 5.1 HASH_RF 中寄存器的偏移地址 所示。 .. list-table:: 表 5.1:HASH_RF 中寄存器的偏移地址 :widths: 10 25 46 :header-rows: 1 * - 偏移量 - 寄存器名称 - 功能描述 * - 0x0 - ip_ver - IP 版本检查寄存器 * - 0x8 - suport - IP 支持的算法检查寄存器 * - 0xC - crtl - HASH 计算控制寄存器 * - 0x10 - cdat - 从 fifo 读取的当前段明文长度,在每个数据段开始时写入 fifo 的值 * - 0x14 - tdat0 - 从 fifo 读取的总明文长度,在数据段首次开始时写入 fifo 的值 * - 0x18 - tdat1 - 从 fifo 读取的总明文长度,在数据段首次开始时写入 fifo 的值 * - 0x1C - tdat2 - 从 fifo 读取的总明文长度,在数据段首次开始时写入 fifo 的值 * - 0x20 - tdat3 - 从 fifo 读取的总明文长度,在数据段首次开始时写入 fifo 的值 * - 0x24 - blk - 512 位或 1024 位块大小计数器 * - 0x28 - tim - 超时寄存器 * - 0x2C - int_enb - 中断使能 * - 0x30 - int_sta - 中断状态 * - 0x34 - sta_msk - 使能的中断状态 * - 0x38 - int_clr - 中断清除 * - 0x3C - fifo - fifo 访问寄存器 * - 0x40 - sys_sta - 中断状态之外的其他状态 * - 0x44 - sft_ini - 通过软件配置进行 IP 初始化 * - 0x50 - k0 - HMAC 的密钥 * - 0x54 - k1 - HMAC 的密钥 * - 0x58 - k2 - HMAC 的密钥 * - 0x5C - k3 - HMAC 的密钥 * - 0x60 - k4 - HMAC 的密钥 * - 0x64 - k5 - HMAC 的密钥 * - 0x68 - k6 - HMAC 的密钥 * - 0x6C - k7 - HMAC 的密钥 * - 0x70 - k8 - HMAC 的密钥 * - 0x74 - k9 - HMAC 的密钥 * - 0x78 - k10 - HMAC 的密钥 * - 0x7C - k11 - HMAC 的密钥 * - 0x80 - k12 - HMAC 的密钥 * - 0x84 - k13 - HMAC 的密钥 * - 0x88 - k14 - HMAC 的密钥 * - 0x8C - k15 - HMAC 的密钥 * - 0x90 - k16 - HMAC 的密钥 * - 0x94 - k17 - HMAC 的密钥 * - 0x98 - k18 - HMAC 的密钥 * - 0x9C - k19 - HMAC 的密钥 * - 0xA0 - k20 - HMAC 的密钥 * - 0xA4 - k21 - HMAC 的密钥 * - 0xA8 - k22 - HMAC 的密钥 * - 0xAC - k23 - HMAC 的密钥 * - 0xB0 - k24 - HMAC 的密钥 * - 0xB4 - k25 - HMAC 的密钥 * - 0xB8 - k26 - HMAC 的密钥 * - 0xBC - k27 - HMAC 的密钥 * - 0xC0 - k28 - HMAC 的密钥 * - 0xC4 - k29 - HMAC 的密钥 * - 0xC8 - k30 - HMAC 的密钥 * - 0xCC - k31 - HMAC 的密钥 * - 0xD0 - H0 - HASH 摘要 * - 0xD4 - H1 - HASH 摘要 * - 0xD8 - H2 - HASH 摘要 * - 0xDC - H3 - HASH 摘要 * - 0xE0 - H4 - HASH 摘要 * - 0xE4 - H5 - HASH 摘要 * - 0xE8 - H6 - HASH 摘要 * - 0xEC - H7 - HASH 摘要 * - 0xF0 - H8 - HASH 摘要 * - 0xF4 - H9 - HASH 摘要 * - 0xF8 - H10 - HASH 摘要 * - 0xFC - H11 - HASH 摘要 * - 0x100 - H12 - HASH 摘要 * - 0x104 - H13 - HASH 摘要 * - 0x108 - H14 - HASH 摘要 * - 0x10C - H15 - HASH 摘要 IP 版本寄存器 ~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x0`` .. list-table:: 表 5.2:IP_VER 寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - MICRO - 7:0 - 只读 - 0x0 - 微版本 * - MINOR - 15:8 - 只读 - 0x0 - 次版本 * - MAJOR - 23:16 - 只读 - 0x1 - 主版本 * - Reserved - 31:24 - / - 0x0 - / 算法支持寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x8`` .. list-table:: 表 5.3:suport 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - ALG_SHA1 - 0 - 只读 - 0x1 - sha1 算法选择 - 1'd0: 不支持 - 1'd1: 支持 * - ALG_MD5 - 1 - 只读 - 0x1 - md5 算法选择 - 1'd0: 不支持 - 1'd1: 支持 * - ALG_SHA224 - 2 - 只读 - 0x1 - sha224 算法选择 - 1'd0: 不支持 - 1'd1: 支持 * - ALG_SHA256 - 3 - 只读 - 0x1 - sha256 算法选择 - 1'd0: 不支持 - 1'd1: 支持 * - ALG_SHA512 - 4 - 只读 - 0x1 - sha512 算法选择 - 1'd0: 不支持 - 1'd1: 支持 * - ALG_SM3 - 5 - 只读 - 0x1 - sm3 算法选择 - 1'd0: 不支持 - 1'd1: 支持 * - ALG_SHA384 - 6 - 只读 - 0x1 - sha384 算法选择 - 1'd0: 不支持 - 1'd1: 支持 * - 保留 - 31:7 - / - 0x0 - / HASH 控制寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xC`` .. list-table:: 表 5.4:ctrl 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - SUSPEND - 0 - 读写 - 0x0 - 挂起当前的哈希或 hmac 计算,ip_init 清零 - 1'd0: 禁用挂起 - 1'd1: 启用挂起 * - RESUME - 1 - 读写 - 0x0 - 从挂起状态恢复,高电平有效 * - DMAEN - 2 - 读写 - 0x0 - 启用 dma 模式 - 1'd0: 禁用 DMA - 1'd1: 启用 DMA * - DATA TYPE - 4:3 - 读写 - 0x0 - 数据交换选择 - 00: 32 位数据。写入 fifo 的数据直接写入,不重新排序 - 01: 16 位数据或半字。来自总线的数据被视为两个半字,并在写入 fifo 之前交换 - 10: 8 位数据或字节。来自总线的数据被视为四个字节,并在写入 fifo 之前交换 - 11: 位数据或位串。来自总线的数据被视为 32 位(字符串的第一位在位置 0),并在写入 fifo 之前交换 * - MODE - 5 - 读写 - 0x0 - 配置为使用哈希函数或 hmac - 1'd0: 哈希模式 - 1'd1: hmac 模式 * - LAST - 6 - 读写 - 0x0 - 最后一段数据指示 - 1'd0: 不是最后一段 - 1'd1: 最后一段 * - ALGO - 9:7 - 读写 - 0x0 - 算法选择 - 000: 选择 SHA-1 算法,该配置值仅用于硬件支持此功能 - 001: 选择 MD5 算法,该配置值仅用于硬件支持此功能 - 010: 选择 SHA-224 算法,该配置值仅用于硬件支持此功能 - 011: 选择 SHA-256 算法,该配置值仅用于硬件支持此功能 - 100: 选择 SHA-512 算法,该配置值仅用于硬件支持此功能 - 101: 选择 SM3 算法,该配置值仅用于硬件支持此功能 - 110: 选择 sha384 算法,该配置值仅用于硬件支持此功能 * - HSH_HMC_EN - 10 - 读写 - 0x0 - 哈希或 hmac 启用配置 - 1'd0: 禁用 - 1'd1: 启用 * - FST_SEG - 11 - 读写 - 0x0 - 第一段指示 - 1'd0: 不是第一段 - 1'd1: 第一段 * - 保留 - 31:12 - / - 0x0 - / 当前数据段长度寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x10`` .. list-table:: 表 5.5:cdat 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CALCLEN - 31:0 - 读写 - 0x0 - 用于哈希计算的当前明文长度,单位字节 总数据长度 0 寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x14`` .. list-table:: 表 5.6:tdat0 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - TOTLEN0 - 31:0 - 读写 - 0x0 - - 总明文长度的低 32 位,单位字节 - 如果有 sha512 或 sha384,则 totlen[127:0] * 8 + 1024 必须不溢出 128 位 - 其他算法,totlen[63:0]*8 + 512 必须不溢出 64 位,否则填充会出错 总数据长度 1 寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x18`` .. list-table:: 表 5.7:tdat1 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - TOTLEN1 - 31:0 - 读写 - 0x0 - - 总明文长度的高 32 位,单位字节 - 如果有 sha512 或 sha384,则 totlen[127:0] * 8 + 1024 必须不溢出 128 位 - 其他算法,totlen[63:0]*8 + 512 必须不溢出 64 位,否则填充会出错 总数据长度 2 寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x1C`` .. list-table:: 表 5.8:tdat2 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - TOTLEN2 - 31:0 - 读写 - 0x0 - - 总明文长度的更高 32 位,单位字节 - 如果有 sha512 或 sha384,则 totlen[127:0] * 8 + 1024 必须不溢出 128 位 - 其他算法,totlen[63:0]*8 + 512 必须不溢出 64 位,否则填充会出错 总数据长度 3 寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x20`` .. list-table:: 表 5.9:tdat3 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - TOTLEN2 - 31:0 - 读写 - 0x0 - - 总明文长度的最高 32 位,单位字节 - 如果有 sha512 或 sha384,则 totlen[127:0] * 8 + 1024 必须不溢出 128 位 - 其他算法,totlen[63:0]*8 + 512 必须不溢出 64 位,否则填充会出错 块大小计数器寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x24`` .. list-table:: 表 5.10:blk 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - CNT - 31:0 - 读写 - 0x0 - 块计数,挂起时需要复制 超时寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x28`` .. list-table:: 表 5.11:tim 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - OUT - 15:0 - 读写 - 65535 - fifo 请求超时;单位:时钟周期;默认值不会产生超时,用户应将其更改为小于默认值的任何值以使用超时功能 * - 保留 - 31:16 - / - 0x0 - / 中断使能寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x2C`` .. list-table:: 表 5.12:int_enb 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - HSHIE - 0 - 读写 - 0x0 - 哈希计算完成中断使能 - 1'b0: 禁用 - 1'b1: 启用 * - FIFOREQIE - 1 - 读写 - 0x0 - fifo 写请求中断使能 - 1'b0: 禁用 - 1'b1: 启用 * - OVRELWIE - 2 - 读写 - 0x0 - fifo 满中断使能 - 1'b0: 禁用 - 1'b1: 启用 * - UNDFLWIE - 3 - 读写 - 0x0 - fifo 空中断使能 - 1'b0: 禁用 - 1'b1: 启用 * - TOUTIE - 4 - 读写 - 0x0 - fifo 请求数据无应答中断超时中断使能 - 1'b0: 禁用 - 1'b1: 启用 * - DLENIE - 5 - 读写 - 0x0 - 数据长度错误中断使能,当一个段就绪时,当前段数据长度 = 0 - 1'b0: 禁用 - 1'b1: 启用 * - SEGIE - 6 - 读写 - 0x0 - 一个段计算完成中断使能 - 1'b0: 禁用 - 1'b1: 启用 * - OPADIE - 7 - 读写 - 0x0 - hmac opad 密钥输入请求中断使能 - 1'b0: 禁用 - 1'b1: 启用 * - 保留 - 31:8 - / - 0x0 - / 中断状态(使能掩码前)寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x30`` .. list-table:: 表 5.13:int_sta 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - HSHINT - 0 - 只读 - 0x0 - 哈希计算完成指示,高电平有效 * - FIFOREQINT - 1 - 只读 - 0x0 - fifo 写请求指示,高电平有效 * - OVRELWINT - 2 - 只读 - 0x0 - fifo 满指示,高电平有效 * - UNDFLWINT - 3 - 只读 - 0x0 - fifo 空指示 ,高电平有效 * - TOUTINT - 4 - 只读 - 0x0 - fifo 请求数据无应答中断,高电平有效 * - DLENINT - 5 - 只读 - 0x0 - 在开始向输入 fifo 写入段数据时,HASH 开始工作,检测到段数据长度 = 0 中断,高电平有效 * - SEGINT - 6 - 只读 - 0x0 - 一个段计算完成中断状态,高电平有效 * - OPADINT - 7 - 只读 - 0x0 - hmac opad 密钥输入请求中断 * - 保留 - 31:8 - / - 0x0 - / 中断状态(使能掩码后)寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x34`` .. list-table:: 表 5.14:sta_msk 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - HSHINTMSK - 0 - 只读 - 0x0 - 掩码后的哈希计算完成指示,高电平有效 * - FIFOREOINTMSK - 1 - 只读 - 0x0 - 掩码后的 fifo 写请求指示,高电平有效 * - OVRELWINTMSK - 2 - 只读 - 0x0 - 掩码后的 fifo 溢出指示,高电平有效 * - UNDFLWINTMSK - 3 - 只读 - 0x0 - 掩码后的 fifo 下溢指示,高电平有效 * - TOUTINTMSK - 4 - 只读 - 0x0 - 掩码后的 fifo 请求数据无应答中断,高电平有效 * - DLENINTMSK - 5 - 只读 - 0x0 - 掩码后的当一个段就绪时,数据长度 = 0 或非最后段 blk_len = 0 中断,高电平有效 * - SEGINTMSK - 6 - 只读 - 0x0 - 掩码后的一个段计算完成中断,高电平有效 * - OPADINTMSK - 7 - 只读 - 0x0 - 掩码后的 hmac opad 密钥输入请求中断,高电平有效 * - 保留 - 31:8 - / - 0x0 - / 中断状态清除寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x38`` .. list-table:: 表 5.15:int_clr 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - HSHINTC - 0 - 写1清0 - 0x0 - 哈希计算完成中断状态清除 * - 保留 - 1 - / - 0x0 - / * - OVRELWINTC - 2 - 写1清0 - 0x0 - fifo 满中断状态清除 * - UNDFLWINTC - 3 - 写1清0 - 0x0 - fifo 空中断状态清除 * - TOUTINTC - 4 - 写1清0 - 0x0 - fifo 请求数据无应答中断状态清除 * - DLENINTC - 5 - 写1清0 - 0x0 - 当一个段就绪时,数据长度 = 0 或非最后段 blk_len = 0 中断状态清除 * - SEGINTC - 6 - 写1清0 - 0x0 - 一个段计算完成中断状态清除 * - OPADINTC - 7 - 写1清0 - 0x0 - hmac opad 密钥输入请求中断状态清除 * - 保留 - 31:8 - / - 0x0 - / FIFO 写或读访问寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x3C`` .. list-table:: 表 5.16:fifo 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DATA - 31:0 - 读写 - 0x0 - 用于写或读 fifo 的数据总线 IP 系统状态寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x40`` .. list-table:: 表 5.17:sys_sta 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - FLVL - 2:0 - 只读 - 0x0 - FIFO 级别阈值 - 000: FIFO 空 - 0001: FIFO <= ¼ 但不空 - 010: ¼ < FIFO <= ½ - 011: ½ < FIFO <= ¾ - 100: ¾ < FIFO 但不满 - 101: FIFO 满 **注意**:fifo 深度的 3/4 意味着(深度/2 + 深度/4),如果 fifo 深度不能精确除以 4,并且级别涉及 3/4 深度,则实际级别值应根据 3/4 深度=(深度/2 + 深度/4)计算 * - 保留 - 3 - / - 0x0 - / * - BLKRDY - 4 - 只读 - 0x0 - 指示是否已将一个块大小的数据推送到 fifo,当挂起并切换到其他算法时应检测此位,高电平有效 * - 保留 - 31:5 - / - 0x0 - / 软件初始化寄存器 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x44`` .. list-table:: 表 5.18:sft_int 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - IP_INIT - 0 - 写1清0 - 0x0 - 软件初始化消息摘要计算, - 0: 不初始化 - 1: 初始化 * - 保留 - 31:1 - / - 0x0 - / HMAC 密钥或数据寄存器 0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x50`` .. list-table:: 表 5.19:k0 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [1023:32*31] 的 32 位密钥 - 对于块大小 = 512, 块的 [511:480] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x54`` .. list-table:: 表 5.20:k1 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [991:32*30] 的 32 位密钥 - 对于块大小 = 512, 块的 [479:448] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x58`` .. list-table:: 表 5.21:k2 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [959:32*29] 的 32 位密钥 - 对于块大小 = 512, 块的 [447:416] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x5C`` .. list-table:: 表 5.22:k3 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [927:32*28] 的 32 位密钥 - 对于块大小 = 512, 块的 [415:384] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x60`` .. list-table:: 表 5.23:k4 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [895:32*27] 的 32 位密钥 - 对于块大小 = 512, 块的 [383:352] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x64`` .. list-table:: 表 5.24:k5 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [863:32*26] 的 32 位密钥 - 对于块大小 = 512, 块的 [351:320] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x68`` .. list-table:: 表 5.25:k6 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [831:32*25] 的 32 位密钥 - 对于块大小 = 512, 块的 [319:288] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x6C`` .. list-table:: 表 5.26:k7 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [799:32*24] 的 32 位密钥 - 对于块大小 = 512, 块的 [287:256] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x70`` .. list-table:: 表 5.27:k8 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [767:32*23] 的 32 位密钥 - 对于块大小 = 512, 块的 [255:224] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x74`` .. list-table:: 表 5.28:k9 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [735:32*22] 的 32 位密钥 - 对于块大小 = 512, 块的 [223:192] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 10 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x78`` .. list-table:: 表 5.29:k10 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [703:32*21] 的 32 位密钥 - 对于块大小 = 512, 块的 [191:160] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 11 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x7C`` .. list-table:: 表 5.30:k11 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [671:32*20] 的 32 位密钥 - 对于块大小 = 512, 块的 [159:128] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 12 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x80`` .. list-table:: 表 5.31:k12 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [639:32*19] 的 32 位密钥 - 对于块大小 = 512, 块的 [127:96] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 13 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x84`` .. list-table:: 表 5.32:k13 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [607:32*18] 的 32 位密钥 - 对于块大小 = 512, 块的 [95:64] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 14 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x88`` .. list-table:: 表 5.33:k14 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [575:32*17] 的 32 位密钥 - 对于块大小 = 512, 块的 [63:32] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 15 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x8C`` .. list-table:: 表 5.34:k15 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [543:32*16] 的 32 位密钥 - 对于块大小 = 512, 块的 [31:0] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 16 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x90`` .. list-table:: 表 5.35:k16 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [511:32*15] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 17 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x94`` .. list-table:: 表 5.36:k17 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [479:32*14] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 18 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x98`` .. list-table:: 表 5.37:k18 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [447:32*13] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 19 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x9C`` .. list-table:: 表 5.38:k19 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [415:32*12] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 20 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xA0`` .. list-table:: 表 5.39:k20 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [383:32*11] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 21 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xA4`` .. list-table:: 表 5.40:k21 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [351:32*10] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 22 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xA8`` .. list-table:: 表 5.41:k22 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [319:32*9] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 23 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xAC`` .. list-table:: 表 5.42:k23 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [287:32*8] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 24 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xB0`` .. list-table:: 表 5.43:k24 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [255:32*7] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 25 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xB4`` .. list-table:: 表 5.44:k25 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [223:32*] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 26 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xB8`` .. list-table:: 表 5.45:k26 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [191:32*5] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 27 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xBC`` .. list-table:: 表 5.46:k27 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [159:32*4] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xC0`` .. list-table:: 表 5.47:k28 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [127:32*3] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 29 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xC4`` .. list-table:: 表 5.48:k29 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [95:32*2] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 30 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xC8`` .. list-table:: 表 5.49:k30 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [63:32*1] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HMAC 密钥或数据寄存器 31 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xCC`` .. list-table:: 表 5.50:k31 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - DAT - 31:0 - 只读 - 0x0 - - 对于块大小 = 1024, 块的 [31:32*0] 的 32 位密钥 - 注意:仅在密钥写入 IN FIFO 后,且没有其他数据输入到 IN FIFO,然后启用 HASH 计算,所有密钥将由硬件读取到寄存器中,然后软件可以从该寄存器读取密钥,否则回读可能不是密钥,因为这是密钥和消息共享的寄存器。 HASH 摘要寄存器 0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xD0`` .. list-table:: 表 5.51:H0 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [511:480] - 对于块大小 = 512, HASH 摘要的 H [255:224] HASH 摘要寄存器 1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xD4`` .. list-table:: 表 5.52:H1 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [479:448] - 对于块大小 = 512, HASH 摘要的 H [223:192] HASH 摘要寄存器 2 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xD8`` .. list-table:: 表 5.53:H2 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [447:416] - 对于块大小 = 512, HASH 摘要的 H [191:160] HASH 摘要寄存器 3 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xDC`` .. list-table:: 表 5.54:H3 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [415:384] - 对于块大小 = 512, HASH 摘要的 H [159:128] HASH 摘要寄存器 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xE0`` .. list-table:: 表 5.55:H4 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [383:352] - 对于块大小 = 512, HASH 摘要的 H [127:96] HASH 摘要寄存器 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xE4`` .. list-table:: 表 5.56:H5 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [351:320] - 对于块大小 = 512, HASH 摘要的 H [95:64] HASH 摘要寄存器 6 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xE8`` .. list-table:: 表 5.57:H6 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [319:288] - 对于块大小 = 512, HASH 摘要的 H [63:32] HASH 摘要寄存器 7 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xEC`` .. list-table:: 表 5.58:H7 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [287:256] - 对于块大小 = 512, HASH 摘要的 H [31:0] HASH 摘要寄存器 8 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xF0`` .. list-table:: 表 5.59:H8 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [255:224] HASH 摘要寄存器 9 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xF4`` .. list-table:: 表 5.60:H9 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [223:192] HASH 摘要寄存器 10 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xF8`` .. list-table:: 表 5.61:H10 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [191:160] HASH 摘要寄存器 11 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0xFC`` .. list-table:: 表 5.62:H11 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [159:128] HASH 摘要寄存器 12 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x100`` .. list-table:: 表 5.63:H12 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [127:96] HASH 摘要寄存器 13 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x104`` .. list-table:: 表 5.64:H13 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [95:64] HASH 摘要寄存器 14 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x108`` .. list-table:: 表 5.65:H14 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [63:32] HASH 摘要寄存器 15 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 地址偏移:``0x10C`` .. list-table:: 表 5.66:H15 的寄存器格式 :widths: 15 10 10 15 50 :header-rows: 1 * - 字段 - 位 - 访问 - 复位值 - 描述 * - reg - 31:0 - 读写 - 0x0 - - 对于块大小 = 1024, HASH 摘要的 H [31:0]