好像没什么人关注这个硬件AES,我来简单看下使用方式


简介

这个AES硬件几乎支持AES的所有加解密模式,并且支持2个DMA,一个输入一个输出。


AES主要的特性

支持128和256位密钥,带32位数据缓存,带IV寄存器


AES功能描述

硬件加速器支持4种模式:

  1. 使用存储在 AES_KEYRx 寄存器中的密钥进行加密。
  2. 在启用AES之前就把扩展密钥计算好并存放在 AES_KEYRx 寄存器中,这个模式独立于 AES 链接模式选择。
  3. 用 AES_KEYRx 中的密钥进行解密
  4. 密钥派生和解密同时进行,计数器链接模式除外

注意:在启用AES之前,必须先把密钥放到 AES_KEYRx 里。

在选择链接模式之前,必须在AES禁用的情况下(也就是AES_CR寄存器中的 bit EN = 0),强制写入 AES_CR 和 AES_IVR 寄存器的 CHMOD[2:0] 位。

一旦启用(AES_CR寄存器中的bit EN = 1), AES就处于输入阶段,等待软件将模式1、3或4的输入数据字写入AES_DINR(4字)。 数据对应明文消息或密码消息。 在对AES_DINR寄存器的两次连续写操作之间自动插入一个等待周期,以便将密钥与数据交叉发送到AES处理器。

对于模式2,密钥派生处理在AES_CR寄存器的EN位设置之后立即开始。 它要求在启用AES之前用加密密钥加载AES_KEYRx寄存器。 在密钥推导处理的最后设置AES_SR寄存器中的计算完成标志(CCF)。 派生密钥在AES_KEYRx寄存器中可用,AES被硬件禁用。 在这种模式下,当启用AES时,除非硬件将CCF标志设置为1,否则不能读取AES_KEYRx寄存器。

一旦计算阶段完成,AES_SR寄存器中的状态标志CCF就会被设置。 如果在AES_CR寄存器中CCFIE = 1位(CCF中断使能),则可以生成中断。 然后,软件可以从AES_DOUTR寄存器(对于模式1、3、4)或AES_KEYRx寄存器(如果选择模式2)读回数据。

当DMA被使用(在AES_CR寄存器中DMAOUTEN = 1)时,标志CCF没有任何意义,因为读取AES_DOUTR寄存器是由DMA自动管理的,在计算阶段结束时没有任何软件操作。

该操作以输出阶段结束,在此期间,软件以模式1、3或4从AES_DOUTR寄存器依次读取4个输出数据字。 在模式2(密钥派生模式)中,数据自动存储在AES_KEYRx寄存器中,AES被硬件禁用。 然后,软件可以选择模式3(解密模式),然后启用AES使用这个衍生密钥开始解密。

在输入和输出阶段,软件必须连续地读或写数据字节(模式2除外),但AES容忍每次读或写操作之间发生的任何延迟(例如:如果此时服务另一个中断)。

当检测到意外的读或写操作时,设置AES_SR寄存器中的读错误标志(RDERR)和写错误标志(WRERR)。 如果在AES_CR寄存器中设置了error interrupt enable (ERRIE)位,就可以生成一个中断。 在错误检测后,AES不会被禁用,并照常继续处理。

也可以使用通用DMA来编写输入字和读取输出字(参见图205和图206)。

通过重置AES_CR寄存器中的EN位,可以随时重新初始化AES。 然后,可以通过设置EN = 1重新启动AES,等待写入第一个输入数据字节(模式2除外,在模式2中,一旦设置了EN位,密钥派生处理就开始,从存储在AES_KEYRx寄存器中的值开始)。


加解密的密钥

AES_KEYRx寄存器用于存储加密或解密密钥。 这四个(独立的8个)寄存器组织在小端配置中:必须使用密钥的32位LSB加载寄存器AES_KEYR0。 因此,AES_KEYR3(分别为AES_KEYR7)必须使用128位密钥的32位MSB加载(分别使用256位密钥的32位MSB加载)。

注意:

  1. 当选择密钥长度为128位或256位时,使用AES_KEYR0到AES_KEYR3寄存器。
  2. AES_KEYR4到AES_KEYR7寄存器仅在选择密钥长度为256位时使用。

当禁用AES (EN = 0进入AES_CR寄存器)时,用于加密或解密的密钥必须存储在这些寄存器中。 它们的端点是固定的。

在模式2(密钥派生)中,需要使用加密密钥加载AES_KEYRx。 然后,必须启用AES。 在计算阶段结束时,派生密钥自动存储在AES_KEYRx寄存器中,覆盖前面的加密密钥。 当派生密钥可用时,硬件将禁用AES。 如果软件需要将AES切换到模式3(解密模式),那么如果AES_KEYRx寄存器的内容对应于派生密钥(之前由模式2计算),则不需要再去写这个寄存器。

在模式4(密钥派生+解密)中,AES_KEYRx寄存器只包含加密密钥。 派生密钥是在内部计算的,不需要对这些寄存器进行任何写操作。


AES 链接模式算法

AES硬件支持五种算法,当AES被禁用(bit EN = 0)时,可以通过AES_CR寄存器中的CHMOD[2:0]位进行选择:

  • 电子密码本(ECB)
  • 密码块链接(CBC)
  • 计数器模式(CTR)
  • 伽罗瓦计数器模式(GCM)和伽罗瓦消息认证码模式(GMAC)
  • 密文认证码模式(CMAC)

ECB模式

这是默认模式。 该方式不使用AES_IVR寄存器。 没有链接操作。 消息被分成多个块,每个块分别加密。


CBC模式

在CBC (cipher-block chain)模式下,每一个明文块在加密前都与前一个密文块进行异或。 为了使每个消息唯一,在第一个块处理期间使用了一个初始化向量(AES_IVRx)。



备注:启用AES时,读AES_IVR返回值为0x0000 0000。

给定消息的挂起模式

如果需要处理另一条具有更高优先级的消息,则可以挂起一条消息。 发送此最高优先级消息后,挂起的消息可能会以加密或解密模式恢复。 只有当CPU访问AES_DOUTR和AES_DINR寄存器完成数据传输时,此特性才可用。 当DMA控制器管理数据传输时,建议不要使用它。

为了正确的操作,消息必须在块处理结束时挂起(在第四次读取AES_DOUTR寄存器之后,在与要处理的下一个块的输入相对应的下一个AES_DINR写访问之前)。

AES应该被禁用写入AES_CR寄存器中的EN = 0位。 在消息中断之前,软件必须读取AES_IVRx,该AES_IVRx包含用于链接XOR操作的最新值。 必须在必须恢复被中断的消息时(当禁用AES时),通过写入AES_IVRx寄存器来存储该值以供重用。

注意:这不会中断链接操作,只要再次启用AES发送下一个128位数据块,消息处理就可以恢复。

注意:无论AES配置(加密或解密模式)如何,此行为都是有效的。

图195给出了一个消息1的示例,该消息1被挂起以发送优先级更高、比消息1短的消息2。 在128位块处理结束时,禁用AES。 为了不中断链接操作,将回读AES_IVR寄存器以存储待恢复消息时检索的值。 然后,将AES配置为发送消息2,并使其能够开始处理。 在消息2处理结束时,必须再次禁用AES,并且必须使用先前在消息1被中断时存储的值加载AES_IVRx寄存器。 然后,一旦启用AES恢复消息1,软件必须从对应于块4的输入值重新启动。

CTR模式

在计数器模式下,除了使用nonce值外,还使用32位计数器与密文或明文进行异或操作(参见图196和图197)。



nonce值和32位计数器可以通过AES_IVRx寄存器访问,其组织方式如下图198所示:


在计数器模式下,计数器从要处理的每个块的初始值开始递增,以保证一个长时间不重复的唯一序列。 它是一个32位计数器,这意味着nonce消息保留为禁用AES时存储的初始值。 只有128位初始化向量寄存器的32位LSB表示计数器。 与CBC模式(在处理第一个数据块时只使用一次AES_IVRx寄存器)不同,在计数器模式中,AES_IVRx寄存器用于处理每个数据块。

在计数器模式下,密钥推导+解密模式不适用。

注意:AES_IVRx寄存器只在禁用AES (bit EN = 0)时写入,以保证良好的AES行为。
在启用AES时读取它将返回值0x00000000。
在禁用AES时读取它将返回最新的计数器值(对于管理挂起模式很有用)。

在CTR模式下,密钥派生+解密没有任何作用。 因此,禁止在AES_CR寄存器中设置MODE[1:0] = 11,任何设置此配置的尝试都将被强制设置MODE[1:0] = 10(对应于CTR模式解密)。 它使用AES处理器的加密块来解密消息,如图197所示。

在CTR模式下暂停模式

就像CBC模式,可以中断消息,发送更高优先级的消息,并恢复被中断的消息。 有关挂起模式功能的详细信息,请参阅图195和第28.5.2节。

GCM模式

GCM允许对明文进行加密和认证,生成相应的密文和TAG(也称为消息认证码或消息完整性检查)。 它基于计数器模式的AES进行保密,并在固定的有限字段上使用乘法器生成TAG。 它在开始时需要一个初始化向量。 消息进程可以分为2个不同的部分:

  • 第一个仅被验证的(消息的头部)
  • 第二次验证和加密(有效载荷)

标题部分必须在有效负载之前,这两个部分不能混合。 GCM标准要求在消息的末尾通过一个特殊的128位块,由64位上的报头大小和64位上的有效载荷大小组成。 在计算期间,我们必须区分头部的块和有效载荷的块。

  • 报头(也就是额外的认证数据):经过认证但不被保护的数据(例如路由数据包的信息)
  • 有效载荷(又称明文/密文):受保护的消息本身。

在GCM模式下,用户必须遵循4个阶段: GCM初始化,GCM报头,GCM有效载荷,GCM结束。

GCM初始化阶段: 在第一步中,哈希键被计算并在内部保存,以便在处理所有块时使用。

  1. 通过清除EN (AES_CR),确保已禁用AES核。
  2. 在AES_CR中通过编程CHMOD[1:0] = 011选择GCM链接模式。
  3. 在AES_CR中配置GCMPH[1:0] = 00,指示GCM初始阶段,并在AES_CR中强制DATATYPE[1:0] = 00 (No swap)。
  4. 通过在AES_CR寄存器中选择mode[1:0]= 00进行加密或mode[1:0]= 10进行解密来选择模式。
  5. 初始化AES_KEYRx和IV中的密钥寄存器(128/256位)。
  6. 将AES_CR寄存器的EN位设置为1,开始计算哈希键。 计算完成后,EN自动复位。
  7. 等待,直到AES_SR寄存器中的CCF标志被设置为1(或者使用相应的中断),然后进入下一阶段。
  8. 通过在AES_CR中设置CCFC来擦除CCF标志。

GCM报头阶段: 在GCM初始化阶段之后执行。

  1. 在AES_CR寄存器中设置GCMPH= " 01 ",表示我们处于头阶段,并在AES_CR中配置DATATYPE[1:0] (1位、8位、16位或32位)
  2. 通过在AES_CR寄存器中设置EN位启用AES
  3. 将4次的头消息写入AES_DINR寄存器。
  4. 等待,直到AES_SR寄存器的计算标志CCF设置为1(或使用相应的中断)
  5. 通过设置AES_CR寄存器中的CCFC位来擦除CCF
  6. 重复(3)、(4)和(5),直到插入每个报头块。 或者,也可以使用DMA

GCM有效负载阶段(加密/解密): 这个步骤在GCM_header阶段之后。

  1. 选择AES_CR寄存器中GCMPH的组合10。
  2. 将4次的有效负载消息写入AES_DINR寄存器。
  3. 等待,直到AES_SR中的计算标志CCF设置为1(或者使用相应的中断)。
  4. 通过在CCFC位(AES_CR)中写入1来擦除CCF标志。 这必须在插入下一个块之前完成。
  5. 读取AES_DOUTR 4次,得到(密文/明文)。 在开始一个新的区块之前,这是必须的。
  6. 重复(16), (17),(18) 和 (19),直到所有有效载荷块的密码或解密为止。 或者,也可以使用DMA。

GCM 最后阶段: 在最后一步中,我们生成身份验证标记。

  1. 在AES_CR中选择组合GCMPH[1:0] = 11。
  2. 将4次的输入写入AES_DINR寄存器:输入必须由编码为64位的头长度和编码为64位的有效载荷长度组成。
  3. 等待,直到AES_SR寄存器的计算标志CCF设置为1(或者使用相应的中断)。
  4. 读取4次AES_DOUTR寄存器:输出是“auth标签”。
  5. 通过将AES_CR中的CCFC位设置为1来清除AES_SR寄存器中的CCF标志。
  6. 通过将AES_CR中的EN位设置为0禁用AES处理器。

从标头阶段移动到标记阶段时,不需要禁用/启用AES处理器。
AES可以直接从init移动到有效负载或/和标记(绕过头阶段或/和有效负载阶段),在这种情况下,应该在选择下一个阶段之后添加AES启用步骤。

AES Galois消息认证码(GMAC)

AES处理器还支持GMAC基于GCM算法对明文进行身份验证,生成相应的TAG。

它基于一个固定有限域上的乘法器来生成TAG。 它在开始时需要一个初始化向量。

实际上,GMAC与GCM应用于仅由报头组成的消息是相同的,所以所有步骤和设置都是相同的,除了阶段3将不会被使用。

GCM中的挂起模式

在GCM算法中,挂起模式可以在报头阶段和有效载荷阶段执行。 建议不要在初始化阶段或标记阶段使用挂起模式,因为挂起模式在这些阶段没有好处:

在报头阶段暂停模式:用户必须遵循以下步骤:

在中断当前消息之前:

  1. 确保从AES_SR读取的CCF标志设置为1。
  2. 将AES_CR中的CCFC设置为1,清除AES_SR寄存器中的CCF标志。
  3. 将 AES_SUSPxR 寄存器保存到内存中。
  4. 将“AES_CR”中的“EN”设置为“0”,禁用AES处理器。
  5. 将当前AES配置保存到内存中。

恢复步骤:

  1. 通过读取AES_CR中的EN位确保禁用了AES处理器。
  2. 将 AES_SUSPxR 寄存器回写到它们相应的挂起寄存器中。
  3. 用CR寄存器、IV寄存器和键寄存器中的初始值重新配置AES。
  4. 通过在AES_CR寄存器中设置EN来启用AES处理器。

在Payload阶段暂停模式:用户必须遵循以下步骤:

在中断当前消息之前:

  1. 读取4次AES_DOUTR寄存器。
  2. 确保busy标志设置为0(只在加密模式下,解密模式下不需要)。
  3. 将AES_SUSPxR 寄存器保存到内存中。
  4. 将AES初始化向量寄存器AES_IVx保存到内存中(注意 : AES_IVx寄存器是在有效负载阶段修改的。)
  5. 设置“EN in AES_CR”为“0”,关闭AES处理器。
  6. 将当前的AES配置保存在内存中(AES初始化向量值除外)

恢复步骤:

  1. 通过在AES_CR中读取EN,确保已禁用AES处理器。
  2. 回写AES_SUSPxR 寄存器到它们相应的挂起寄存器中。
  3. 将AES_IVx寄存器回写到其AES初始化向量中。
  4. 使用CR寄存器和键寄存器中的初始设置值重新配置AES。
  5. 通过在AES_CR寄存器中设置EN位来启用AES处理器。

GMAC的挂起模式

GMAC与GCM算法完全相同,除了:只有报头阶段可以被中断。

CMAC模式

GMAC与GCM算法完全相同,除了:只有报头阶段可以被中断。 CMAC允许对明文进行认证,生成相应的TAG。 消息仅由报头阶段和标记阶段组成。 CCM标准(2003年9月RFC 3610 Counter with CBC-MAC (CCM))为第一个认证块(标准中称为B0)定义了特定的编码规则。 特别是,第一个块包括标志、nonce和以字节表示的有效负载长度。

  1. 确保通过清除EN (AES_CR)禁用AES处理器,并且AES运行模式不同于模式2(密钥派生)和模式4(密钥派生+解密)
  2. 在AES_CR中通过编程CHMOD bits[2:0] = 100选择CMAC链接模式。
  3. 用AES_IVRx中的零值初始化AES_KEYRx和IV中的密钥寄存器(128 / 256位)

CMAC 头部阶段:

注意:在此阶段,AES_DOUTR寄存器中不提供输出。

  1. 在AES_CR中设置GCMPH= " 01 ",表示我们处于头阶段。
  2. 在“AES_CR”中设置“EN”位,启用AES。
  3. 插入B0用于首次传输,插入B用于后续传输。
  4. 将4次的头消息写入AES_DINR寄存器。
  5. 等待,直到设置了计算标志CCF (AES_SR)(或者使用相应的中断)。
  6. 通过在AES_CR中设置CCFC来擦除CCF。
  7. 重复(4)、(5)和(6),直到插入每个头块。 或者,也可以使用DMA。

CMAC Final Phase: 在最后一步中,我们生成授权标签。

注意:在此阶段,消息的授权标记在AES_DOUTR寄存器中提供

  1. 在AES_CR中选择组合GCMPH[1:0] = 11。
  2. 将4次的输入写入AES_DIN寄存器:输入必须是由原始B0包格式化的128位值。 B0的位[7:3]应该被强制为零值)。
  3. 等待直到AES_SR中设置了计算标志CCF。
  4. 读取4次AES_DOUTR:输出为“auth tag”。
  5. 通过提高AES_CR中的CCFC位来擦除标志。
  6. 禁用AES。

注:

1. 硬件不管理原始B0和B1的格式化操作,后者必须包含报头长度。 这个任务必须由软件来完成。

2. 当从头部阶段移动到标记阶段时,不需要禁用/启用AES处理器。

3. 软件根据标签长度对输出的Auth Tag进行过滤,获取有效的Tag。

CMAC模式下的挂起模式

在CMAC算法中,暂停模式只能在报头阶段执行。 建议不要在标记阶段使用挂起模式,因为挂起模式在这个阶段没有好处:

在报头阶段暂停模式CMAC,用户必须遵循以下步骤:

在中断当前信息之前:

  1. 确保AES_SR中的CCF标志设置为1。
  2. 通过将AES_CR中的CCFC位设置为1来清除AES_SR寄存器中的CCF标志。
  3. 在内存中保存AES初始化向量寄存器AES_IVx和AES_SUSPxR 寄存器(AES_IVx寄存器在报头阶段被修改)
  4. 将“AES_CR”中的“EN”设置为“0”,禁用AES处理器。
  5. 将当前AES配置值保存到内存中

恢复步骤:

  1. 确保通过读取AES_CR中的EN位禁用AES处理器。
  2. 将AES_SUSPxR 寄存器回写到它们相应的挂起寄存器中。
  3. 将AES_IVx寄存器回写到其AES初始化向量寄存器中
  4. 用CR寄存器和键寄存器中的初始设置值重新配置AES。
  5. 通过在AES_CR寄存器中设置EN来启用AES处理器。

数据类型

通过将数据写入AES_DINR寄存器,数据在AES处理器中每次输入32位(字)。 AES处理128位数据块。 AES_DINR或AES_DOUTR寄存器必须读或写4次,才能先用MSB处理一个128位的数据块。

系统内存组织是小端式的:无论使用哪种数据类型(位、字节、16位半字、32位字),低有效数据占据最低地址位置。

因此,必须有一点,字节,或半字交换操作执行的数据从系统内存写在AES_DINR进入AES处理之前,必须执行和交换为AES数据从AES_DOUTR寄存器读取系统内存,这取决于类型的数据是加密或解密。

AES_CR寄存器中的DATATYPE位提供了不同的交换模式,在将其发送到AES处理器之前应用于AES_DINR寄存器,并在从处理器输出的数据上应用于AES_DOUTR寄存器(参见图199)。

注意 : 交换操作只涉及AES_DOUTR和AES_DINR寄存器。 AES_KEYRx和AES_IVRx寄存器对所选的交换模式不敏感。 它们有一个固定的小端配置(请参阅第28.4节和第28.14节)。



操作模式

模式1:加密

  1. 通过重置AES_CR寄存器中的EN位来禁用AES。
  2. 通过在AES_CR寄存器中编程mode[1:0] = 00配置模式1,并通过编程CHMOD[2:0]位选择需要执行哪种类型的链接模式。
  3. 通过AES_CR寄存器中的KEYSIZE位配置选择密钥长度128位或256位。
  4. 如果选择CTR、CBC或GCM模式,则写入AES_KEYRx寄存器(128位或256位加加密密钥)和AES_IVRx寄存器。 对于ECB模式,不使用AES_IVRx寄存器。
  5. 写入AES_DINR寄存器4次以输入纯文本(MSB优先),如图201所示:模式1:128位密钥长度的加密。
  6. 等待,直到在AES_SR寄存器中设置了CCF标志。
  7. 读取AES_DOUTR寄存器4次以获得密文(MSB优先),如图201所示:模式1:128位密钥长度的加密。
  8. 重复步骤6、7、8,用相同的加密密钥处理所有的区块

模式2:密钥派生

  1. 通过重置AES_CR寄存器中的EN位来禁用AES。
  2. 通过在AES_CR寄存器中编程mode[1:0] = 01来配置模式2。
  3. 通过AES_CR寄存器中的KEYSIZE位配置选择密钥长度128位或256位。
  4. 用加密密钥写入AES_KEYRx寄存器以获得衍生密钥。 对AES_IVRx的写入没有效果。
  5. 通过在AES_CR寄存器中设置EN位启用AES。
  6. 等待,直到在AES_SR寄存器中设置了CCF标志。
  7. 派生密钥被自动放入AES_KEYRx寄存器中。 如果需要的话,读取AES_KEYRx寄存器以获得解密密钥。 AES被硬件禁用。 要重新开始推导键的计算,请重复步骤3、4、5和6。

模式3:解密

  1. 通过重置AES_CR寄存器中的EN位来禁用AES。
  2. 通过在AES_CR寄存器中编程mode[1:0] = 10配置模式3,并通过编程CHMOD[2:0]位选择需要执行哪种类型的链接模式。
  3. 通过AES_CR寄存器中的KEYSIZE位配置选择密钥长度128位或256位。
  4. 使用解密密钥编写AES_KEYRx寄存器(如果派生密钥已经使用模式2:密钥派生存储在AES_KEYRx寄存器中,则可以跳过此步骤)。 当选择CTR、CBC或GCM模式时,写入AES_IVRx寄存器。 对于ECB模式,不使用AES_IVRx寄存器。
  5. 通过在AES_CR寄存器中设置EN位启用AES。
  6. 写入AES_DINR寄存器4次,输入密文(MSB优先),如图203所示:模式3:使用128位密钥长度解密。
  7. 等待,直到在AES_SR寄存器中设置了CCF标志。
  8. 读取AES_DOUTR寄存器4次以获得纯文本(MSB优先),如图203所示:模式3:使用128位密钥长度解密。
  9. 重复步骤6、7、8,使用存储在AES_KEYRx寄存器中的相同派生键处理所有块。

模式4:密钥派生和解密

  1. 通过重置AES_CR寄存器中的EN位来禁用AES。
  2. 通过在AES_CR寄存器中编程mode[1:0] = 11配置模式4。 当CTR、GCM、GMAC和CMAC模式下配置了AES时,禁止使用该模式。 如果软件写入mode[1:0] = 11和CHMOD[2:0] = 010,则会被强制进入CTR解密模式。
  3. 通过AES_CR寄存器中的KEYSIZE位配置选择密钥长度128位或256位。
  4. 用加密密钥写入AES_KEYRx寄存器。 如果选择CBC方式,则写入AES_IVRx寄存器。
  5. 通过在AES_CR寄存器中设置EN位启用AES。
  6. 写入AES_DINR寄存器4次以输入密文(MSB优先),如图204所示:模式4:密钥推导和解密,密钥长度为128位。
  7. 等待,直到在AES_SR寄存器中设置了CCF标志。
  8. 读取AES_DOUTR寄存器4次以获得纯文本(MSB优先),如图204所示:模式4:密钥派生和128位密钥长度的解密。
  9. 重复步骤6、7、8,用相同的加密密钥处理所有的区块。

注意:AES_KEYRx寄存器在处理的所有阶段都包含加密密钥,这些寄存器中不存储派生密钥。 从加密密钥开始的派生密钥存储在AES内部,而不在AES_KEYRx寄存器中存储副本。


AES DMA接口

AES加速器提供了一个连接到DMA控制器的接口。
DMA必须配置为传输字。
AES可以与两个不同的DMA请求通道相关联:

  • 输入的DMA请求通道:当在AES_CR寄存器中设置了DMAINEN位时,每次需要将单词写入AES_DINR寄存器时,AES都会在INPUT阶段发起一个DMA请求(AES_IN)。 DMA通道必须配置为具有32位数据大小的内存到外设模式。
  • 用于输出的DMA请求通道:当DMAOUTEN位被启用时,AES每次需要从AES_DOUTR寄存器读取一个单词时,都会在OUTPUT阶段发起一个DMA请求(AES_OUT)。 DMA通道必须配置为外设到内存模式,数据大小等于32位。

每个阶段有四个DMA请求,如图205和图206所示。

DMA请求会在禁用AES之前生成。 因此,在处理128位数据块的数据输出阶段结束后,AES自动切换到下一个数据块的新数据输入阶段(如果有的话)。

注意:

  1. 对于模式2(密钥派生),可以通过使用CPU的软件来访问AES_KEYRx寄存器。 没有为此目的提供DMA通道。 因此,AES_CR寄存器中的DMAINEN位和DMAOUTEN位在此模式下没有影响。
  2. 当DMAOUTEN = 1时,CCF标志不相关,软件不需要读取。 如果应用程序需要禁用AES来取消DMA管理并为数据输入或数据输出阶段使用CPU访问,则这个位可能会保持高值,并且必须由软件清除。



错误标志

当在计算阶段或输入阶段检测到意外的读操作时,AES_SR寄存器中的AES读错误标志(RDERR)被设置。

当在输出阶段或计算阶段检测到意外的写操作时,AES_SR寄存器中的AES写错误标志(WRERR)被设置。

通过设置AES_CR寄存器中相应的位(CCFC位清除CCF标志,ERRC位清除WERR和RDERR标志)可以清除标志。

如果前面已经设置了AES_CR寄存器中的error interrupt enable (ERRIE)位,那么当设置了其中一个错误标志(WERR或RDERR)时就会产生一个中断。

如果检测到错误,AES不会被硬件禁用,并继续正常处理。

处理用时

下表总结了处理每一种操作模式的128位块所需的时间。



注:选择GCM时模式2和模式4没有意义。
当使用GMAC/CMAC时,模式操作(模式1到模式4)没有意义。


AES 中断


AES寄存器

STM32硬件AES相关推荐

  1. STM32硬件IIC的BUG问题

    问题描述 大概是这样,使用STM32硬件IIC作为主机通讯,只要不发送错误的从机地址, 通讯一直都是没问题的,因为验证程序的关系,所以在程序中修改了一下从机地址, 这时候就出现了问题,下面直接看图把 ...

  2. STM32硬件SPI控制TM1638 按键数码管LED显示模块

    STM32硬件SPI控制TM1638按键数码管LED显示模块   从淘宝买来的,TM1638专门是控制LED的,LED组合起来就可以变成数码管,还有按键,这个我就没管了,不想管了,发这个帖子只是为了记 ...

  3. 12. STM32——硬件IIC驱动OLED屏幕显示

    STM32--硬件IIC驱动OLED屏幕显示 OLED屏幕 OLED屏幕特点 OLED屏幕接线说明 OLED屏幕显存 OLED屏幕原理 OLED屏幕常用指令 OLED屏幕字模软件的使用 写命令 写数据 ...

  4. stm32 硬件IIC使用方法说明与示例---LIS3DH的IIC通信

    有时我们可能需要MCU进行速率较高的IIC总线通信,一般stm32的IIC默认传输速率是100kpbs,最大为400kpbs.现在大部分项目会使用程序IO模拟的IIC,使用方便,具体网上例子很多. 这 ...

  5. STM32硬件CRC32问题记录

    前言:STM32硬件本身没有问题,只是其中的校验值计算方式跟平常的不太一样 硬件平台 我使用的是STM32F103ZET6单片机,用cubeMX新建的工程(使能crc即可加载\STM32F1xx_HA ...

  6. 嵌入式开发-STM32硬件SPI驱动TFT屏

    嵌入式开发-STM32硬件SPI驱动TFT屏 这次用到的TFT屏 CubeMX设置 代码编写 增加的内容 需要注意问题 代码下载 这次用到的TFT屏 现在的TFT屏幕已经很便宜了,65536色屏幕,2 ...

  7. 基于stm32硬件IIC的oled显示

    一 stm32硬件IIC 硬件IIC特性架构 ①通讯引脚 查看对应开发板芯片的原理图可以查看对应IIC外设引脚的位置 这里代码采用的是stm32f103c8t6,硬件IIC的外设引脚为PB6 PB7, ...

  8. 使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911)

    使用STM32+硬件IIC+DMA驱动GT系列触摸屏(GT911) 初始化代码 /** @brief GT911 初始化程序* @param None* @retval None*/ void GT9 ...

  9. STM32硬件SPI驱动OLED

    文章目录 一.OLED相关 1.OLED简介 2.0.96寸的OLED模块概述 3.模块引脚说明 4.汉字点阵编码原理 二.硬件SPI 1.SPI简介 2.SPI的引脚映射关系 三.SPI驱动的OLE ...

最新文章

  1. Springboot的slf4j的配置文件模板
  2. python基础复习
  3. 多继承-注意父类之间注意不要有重名方法或属性
  4. 芒果TV崩了?项目组在家办公效率不行呀!
  5. mongodb的id的唯一性_mongodb中的objectid是collection中唯一,还是全db唯一,还是全宇宙唯一?...
  6. 把时间变成钱?可视化平台实时监控百万数据,决策分析不再等
  7. 人工智能 - paddlepaddle飞桨 - 深度学习基础教程 - 图像分类
  8. 题解-bzoj3901 棋盘游戏
  9. 成本4元、一个月前制成的外卖菜肴包,正霸占你的餐桌
  10. feign调用多个服务_SpringCloud中Feign服务调用请求方式及参数总结(示例代码)
  11. 前端实践(2)——网页嵌入加载地图
  12. 摩克机器人_第三章 摩克都市的一场灾难(上)
  13. 兔年幸运转转盘,看看你今年过年能赚到啥
  14. php kibana查询,Kibana+Logstash+Elasticsearch 日志查询系统搭建
  15. html下拉菜单换背景颜色,如何在select框下拉菜单中更改蓝色突出显示的颜色
  16. 用计算机画画教学设计,电脑版你画画教学设计
  17. shell输入指定日期参数,输出该日期的前一天和后一天
  18. Photoshop切片工具的使用
  19. Python代码质量:工具和最佳实践
  20. updata联表修改

热门文章

  1. IntelliJ IDEA 如何增加运行时候的内存
  2. 让Windows 时间与Internet 时间服务器同步
  3. 增加tensor维度 torch
  4. iphone 微信打开H5自动播放音乐问题
  5. 云服务器上传文件怎么这么慢,百度云上传速度慢怎么办?教你如何加快百度云上传速度...
  6. unity中显示选择题
  7. 深度学习入门论文(必看)
  8. 更改android根目录文件夹读写权限
  9. 做公关必用的四大法宝
  10. 光头老法师手持尼康却能玩出佳能的效果