AMD Vivado™ 设计套件生成加密比特流和加密密钥

 概括

重要提示:有关使用AMD Vivado™ Design Suite 2016.4 及更早版本进行 eFUSE 编程的重要更新,请参阅AMD设计咨询 68832 。

本应用说明介绍了使用AMD Vivado™ 设计套件生成加密比特流和加密密钥(高级加密标准伽罗瓦/计数器模式 (AES-GCM) 和 RSA 身份验证)的简单分步过程。其中还介绍了使用Vivado 设计套件将高级加密标准全球移动通信系统 (AES-GSM) 加密密钥和 RSA 公钥哈希值以及加密比特流编程到AMD UltraScale™ FPGA中的步骤。本应用说明适用于AMD UltraScale™ 和AMD UltraScale+™ FPGA。本文档不旨在讨论安全问题,例如生成密钥或选择初始化向量 (IV) 以符合美国国家标准与技术研究院 (NIST) 标准。

介绍

UltraScale器件具有片上 AES-GCM 解密和身份验证逻辑,可提供高度的设计安全性。加密的UltraScale FPGA 设计无法复制或进行逆向工程。UltraScale FPGA AES 系统包含基于软件的比特流加密和片上比特流解密,并配有专用存储器用于存储加密密钥和加密比特流。加密密钥和加密比特流均使用Vivado工具生成 。

UltraScale器件将加密密钥内部存储在专用 RAM(由小型外部连接电池备份,称为电池备份 RAM (BBRAM))或 eFUSE 中。如果使用 RSA 身份验证,则必须将 RSA 公钥的哈希值编程到 eFUSE 中。加密密钥只能通过 JTAG 端口编程到器件中。BBRAM 和 eFUSE 均无法读回。在配置期间,UltraScale 器件执行反向操作,解密传入的比特流。UltraScale FPGA AES 加密逻辑使用 256 位加密密钥。片上 AES 解密逻辑不能用于比特流解密以外的任何用途;例如,AES 解密逻辑不可用于用户设计,也不能用于解密配置比特流以外的任何数据。

高级加密标准和身份验证

UltraScale FPGA 加密系统采用 AES-GCM 认证加密算法。AES 是 NIST 和美国商务部支持的官方标准(有关更多信息,请参阅高级加密标准 (AES) ( FIPS PUB 197 ) 和 GCM 规范Galois/计数器操作模式 (GCM)(规范))。

AES-GCM 的优势在于它还支持内置身份验证。UltraScale FPGA AES 加密系统使用 256 位加密密钥(NIST 描述的 128 位和 192 位备用密钥长度未实现)来一次加密或解密 128 位数据块。根据 NIST 的说法,256 位密钥有 1.1 x 10 77 种可能的密钥组合。为了获得最安全的方法,建议您手动创建此 256 位密钥,而不是使用Vivado提供的伪随机密钥生成器功能。

比特流认证

AES-GCM 加密标准支持内置身份验证,从而增强了安全性,无需像7 系列FPGA 那样指定单独的 HMAC 密钥。如果不知道 AES-GCM 密钥,比特流就无法被修改或伪造。加密提供了基本的设计安全性,以防止设计被复制或逆向工程,而身份验证则确保用于 FPGA 配置的比特流是由授权用户创建的未经修改的比特流。身份验证可以验证比特流的数据完整性和真实性。

身份验证涵盖所有类型控制和数据的整个比特流。任何比特流篡改(包括单个比特翻转)都会被检测到。如果身份验证通过,配置将在启动周期内完成。如果身份验证失败,且 AES-GCM 引擎检测到任何比特流更改,设备将无法启动。如果启用了回退功能,则在清除整个设备配置后加载回退比特流。如果未启用回退功能,则配置逻辑将禁用配置接口,阻止任何对 FPGA 的访问。需要发送 PROGRAM_B 信号脉冲或上电复位才能复位配置接口。您需要选择以下两种比特流身份验证方式之一:

  • 如果您使用比特流加密,则可以依赖 AES-GCM 标准内置的身份验证。
  • 此外,您可以依赖 RSA-2048 身份验证在解密比特流之前对其进行身份验证。以下段落将讨论 RSA-2048。

RSA 身份验证

AES-GCM 是一种使用对称密钥的自认证算法,这意味着加密密钥与解密密钥相同。由于此密钥是秘密的(因此存储在内部密钥空间中),因此必须加以保护。UltraScale架构提供了一种替代的身份验证形式,即 RSA-2048。RSA 是一种非对称算法,这意味着验证密钥与签名密钥不同。验证使用公钥完成。此公钥无需保护,也无需特殊的安全存储。如果需要,这种身份验证形式可以与加密结合使用,以同时提供真实性和机密性。RSA 不仅具有使用公钥的优势,还具有先认证后解密的优势。RSA 公钥的哈希值必须存储在 eFUSE 中。

UltraScale FPGA 支持 RSA-2048 算法,用于在比特流数据发送到解密器之前对其进行身份验证。此方法可在执行任何解密操作之前确保数据真实可靠,从而有助于防止对解密引擎本身的攻击。RSA 配置控制逻辑将加密的比特流(包括公钥和比特流签名)读入器件存储器。然后,RSA 配置控制逻辑指示 RSA 引擎根据公钥和签名计算预期摘要。

比特流缓冲后,RSA 引擎计算出预期摘要,然后将实际摘要与结果进行比较。如果 RSA 认证通过且配置数据已加密,则释放 FPGA 以解密比特流。如果 RSA 认证失败,则会生成与 AES-GCM 认证错误相同的错误。此时,设备要么锁定,要么(如果启用)执行回退操作。

配置了 RSA 认证比特流的设备所需的时间最多是配置标准未压缩比特流的三倍。实际时间取决于配置模式。RSA 认证不能与比特流压缩、部分重配置或通过 PCIe® 接口(包括串联解决方案)的配置一起使用。

特定配置模式和位宽的UltraScale和UltraScale+器件支持 RSA 身份验证。有关支持 RSA 身份验证的 UltraScale FPGA 器件和配置模式,请参阅《UltraScale 架构配置用户指南》 ( UG570 )中的“RSA 身份验证”部分。

重要提示:如果未使用 eFUSE 编程强制加密,则AMD UltraScale™ 和AMD UltraScale+™ FPGA 系列设备上的 RSA 身份验证可能会被绕过。为避免潜在的安全问题,需要 RSA 身份验证的用户还应通过在 BBRAM 或 eFUSE 中配置 AES 密钥来强制加密,并通过编程 FUSE_SHAD_SEC[0] eFUSE 将设备配置为需要加密比特流。配置为同时强制 RSA 身份验证和加密的设备不易受到 RSA 身份验证问题的影响。有关更多详细信息,请参阅AMD设计咨询 000036039。

按键滚动

UltraScale FPGA 允许您将比特流分解为多个 AES 加密消息,每个消息都使用其自己唯一的密钥进行加密。此功能称为滚动密钥,初始密钥存储在芯片上,而每个连续消息的密钥都在前一个消息中加密(包装)。滚动密钥提高了对差分功率分析 (DPA) 等侧信道攻击的安全性。比特流选项 BITSTREAM.ENCRYPTION.KEYLIFE 定义每个密钥的加密块数量。每个密钥的加密块越少,安全性就越高,但会大大增加比特流大小,从而增加配置时间。选择 1,024 或更高的值会使配置大小增加约 15%,选择 64 的值会使比特流大小增加 50%,选择 32(默认值)会使比特流大小增加一倍以上。下图显示了比特流大小乘数与每个密钥的块数的关系。

比特流大小乘数与每个密钥的块

加密比特流实现概述

以下列出了在UltraScale FPGA 中实现加密设计所需的七个基本步骤:
  1. 选择 AES 密钥存储位置:BBRAM 或 eFUSE;以及相应的安全选项。(请参阅《使用UltraScale 和 UltraScale+ FPGA 开发防篡改设计》 ( XAPP1098 ),了解 BBRAM 和 eFUSE 之间的权衡)。
  2. 选择是否使用 RSA 身份验证:启用 AES-GCM 或 AES-GCM 和 RSA 身份验证。(请参阅《使用 UltraScale 和 UltraScale+ FPGA 开发防篡改设计》 ( XAPP1098 ),了解 AES-GCM 和 RSA 身份验证之间的权衡)。
  3. 根据您选择的 AES 密钥存储位置在电路板设计中实现硬件要求。
  4. 使用Vivado Design Suite软件,生成 AES 密钥或向软件提供您自己的自定义 AES 密钥(这始终是最安全的方法)并加密比特流:
    1. 生成/创建 AES 密钥。
    2. 如果选择 RSA 作为身份验证方法,请使用 OpenSSL ( www.openssl.org ) 或其他密钥生成软件生成 RSA 公钥/私钥对。
  5. 使用 JTAG 接口将 AES 密钥编程到 FPGA 中。
  6. 通过JTAG或其他配置模式(如SPI或BPI)将加密的位文件编程到FPGA中。
    注意:对于支持 RSA 身份验证的UltraScale FPGA 设备和配置模式,请参阅UltraScale 架构配置用户指南(  UG570 )中的 RSA 身份验证部分。
  7. 执行硬件验证以确保正常运行。

硬件板要求

实现加密设计流程有一些基本的硬件要求:

  • 对于编程能力和调试能力:与 FPGA 的 JTAG 连接。
  • 对于 BBRAM 密钥存储:电池连接至 V BATT(有关电池电压,请参阅相应的数据表

    要求)。

  • 对于 eFUSE 密钥存储:建议使用 V BATT或 V CCAUX来启用测试功能

    烧录一次性可编程 (OTP) eFUSE 之前的 BBRAM 流程。

软件要求

建议使用Vivado Design Suite 2017.1 或更新版本。

AES 密钥存储

考虑 AES-GCM 密钥存储时有两个选项:BBRAM 或 eFUSE。

建议:在选择 BBRAM 或 eFUSE 存储选项时,强烈建议您考虑每个选项的优缺点,以及哪个选项最适合您的设计要求。

以下各节详细介绍了它们各自的优缺点。有关每种存储选项的更多信息,请参阅《UltraScale 架构配置用户指南》 ( UG570 )。

BBRAM存储位置

当加密密钥存储在 FPGA 的电池供电 RAM 中时,加密密钥存储单元属于易失性数据,必须持续供电才能保留其内容。正常工作期间,这些存储单元由辅助电压输入 (V CCAUX ) 供电。

建议:需要单独的 V BATT电源输入,以便在 V CCAUX移除时保留密钥。因此,建议在具有备用电池的电路板上对 AES 密钥进行系统内编程。否则,移除电源/电池后,密钥将会丢失。
重要提示:在尝试使用以 BBRAM 为密钥源的加密比特流进行配置之前,请先将 BBRAM 编程为已知状态。如果您在 BBRAM 密钥编程完成之前尝试在上电时下载加密比特流,FPGA 可能会锁定。您必须先重启设备,然后加载 BBRAM 密钥,然后再使用加密比特流进行配置。

下表列出了 BBRAM 存储位置的优点和缺点。

BBRAM存储位置优缺点
优势缺点
  • 易失性和可重新编程
  • 被动和主动密钥清除(例如,可以删除证据)
  • 防篡改1
  • BBRAM 可以使用 RSA 身份验证或配置计数来实现 DPA 保护
  • 由于没有回读路径,无法回读 BBRAM 密钥
  • 需要外部电池。
  • 许多电池供应商没有说明高温运行和/或长寿命。
  1. 没有从 BBRAM 中读取密钥的物理路径(只写访问)。
eFUSE 存储位置

eFUSE 是一种非易失性一次性可编程技术,用于特定配置设置。通过特定时间的大电流来编程(或烧断)保险丝链。用户可编程 eFUSE 可以使用AMD配置工具进行编程。

重要提示: eFUSE 位是一次性可编程 (OTP) 的。一旦编程完成,将无法取消编程。

例如,如果某个寄存器的访问被禁用,则无法重新启用。FPGA 逻辑只能访问 FUSE_USER 寄存器的值。所有其他 eFUSE 位均无法从 FPGA 逻辑访问。下表列出了 eFUSE 存储位置的优缺点。

eFUSE 存储位置的优势和劣势
优势缺点
  • 无需外部电池
  • 只有使用 eFUSE 密钥加密的比特流才能加载到 FPGA 中
  • 由于没有回读路径,无法回读 eFUSE 密钥
  • eFUSE 需要 RSA 身份验证才能实现 DPA 保护
  • 永久:密钥不能被清除或更新。
  • 由于密钥无法被归零或更新,因此安全性不如 BBRAM 解决方案。

混淆密钥

UltraScale FPGA 支持您将 AES 密钥以混淆格式加载到器件中。这样,您就可以将混淆后的密钥提供给合同制造商,而无需向其公开真正的 AES-256 密钥。设置 BITSTREAM.ENCRYPTION.OBFUSCATEKEY 属性后,Vivado write_bitstream 软件会在输出 NKY 文件中创建一个新密钥 ObfuscateKey。此混淆密钥是通过使用存储在硅片中的金属化系列密钥加密您的 AES-256 密钥而创建的。所有UltraScale器件和所有UltraScale+ FPGA 都使用相同的密钥。(UltraScale FPGA 系列密钥与UltraScale+ FPGA 系列密钥不同。)

AMD不提供Vivado工具系列密钥。客户必须将系列密钥请求发送至 secure.solutions@xilinx.com。之后,我们将通过www.amd.com上的产品许可网站将系列密钥分发给符合条件的客户。

要指定家族密钥的位置,您必须设置以下 write_bitstream 属性:

BITSTREAM.ENCRYPTION.FAMILY_KEY_FILEPATH C:/<any directory>/familyKey_us.cfg [current_design]

您可以将加密密钥(而非实际的 AES-256 密钥)提供给合同制造商。当密钥被编程到 eFUSE 或 BBRAM 中时,如果 NKY 文件包含某个KeyObfuscate字段,则存储位置会自动设置一个标志,指示此密钥已加密。生成的比特流还包含附加指令,用于通知芯片在使用密钥解密比特流的其余部分之前,先解密相应的 AES-256 密钥存储位置。比特流所选位置的加密密钥设置必须与比特流的加密密钥设置匹配。BITSTREAM.ENCRYPTION.OBFUSCATEKEY 属性与 BBRAM 密钥存储的配置计数 DPA 对策不兼容。

eFUSE寄存器

UltraScale FPGA 总共有六个 eFUSE 寄存器:FUSE_RSA、FUSE_KEY、FUSE_DNA、FUSE_USER、FUSE_CNTL 和 FUSE_SEC。本应用笔记的重点不在于 FUSE_DNA 寄存器。下表列出了所有 UltraScale eFUSE寄存器。

eFUSE寄存器描述
注册名称大小(位)内容描述
FUSE_RSA384

比特流认证密钥

[383:0]

(首先移位 0 位)

存储用于 RSA 比特流认证的公钥的哈希值。
保险丝钥匙256

比特流加密密钥

[255:0]

(首先移位 0 位)

存储用于 AES-GCM 比特流解密和身份验证的密钥。可以使用 eFUSE 密钥代替存储在电池供电 SRAM (BBRAM) 中的密钥。UltraScale FPGA 解密引擎使用 AES 密钥加载加密比特流。根据 CNTL 寄存器中的读/写访问位,AES 密钥可以通过 JTAG 端口进行编程,但不能通过 JTAG 端口读取。
FUSE_DNA96

由AMD编程的设备标识符

[95:0]

(首先移位 0 位)

唯一设备标识符位 [95:0],对应 96 位只读 DNA_PORTE2 原始值,称为设备 DNA。
FUSE_用户32 或 128

用户定义

[31:0] 或 [127:0]

(首先移位 0 位)

存储 32 位或 128 位用户定义代码。该寄存器的 32 位版本可使用 eFUSE_USR 原语从 FPGA 逻辑读取。(有关 eFUSE_USR 原语的描述,请参阅《UltraScale架构配置用户指南》(UG570) [参照 3] 第 7 章“设计输入”)。根据 CNTL 寄存器中的读/写访问位,可以通过 JTAG 端口对代码进行编程和读取。

该寄存器的 128 位版本存储 128 位用户定义代码。该寄存器可通过 JTAG FUSE_USER_128 指令读取。JTAG FUSE_USER_128 数据寄存器的长度在UltraScale FPGA 中为 384 位,在UltraScale+ FPGA中为 176 位 。仅支持 [127:0] 位用于存储用户代码,其余位保留,可以为任意值。

保险丝控制21

控制位 CNTL

[20:0]

(首先移位 0 位)

控制密钥使用以及对 eFUSE 寄存器的读/写访问。该寄存器可通过 JTAG 端口进行编程和读取。
24

控制位 CNTL

[23:0]

(首先移位 0 位)

在UltraScale+ FPGA 中,这些位控制密钥的使用以及对 eFUSE 寄存器的读/写访问。该寄存器可以通过 JTAG 端口进行编程和读取。
FUSE_SEC32

安全控制位

[31:0]

(首先移位 0 位)

控制加密和身份验证选项。根据 CNTL 寄存器中的读/写访问位,该寄存器可以通过 JTAG 端口进行编程和读取。

eFUSE 控制寄存器 (FUSE_CNTL) 位描述

该寄存器包含用户可编程位,用于选择 AES 密钥的使用方式以及设置其他 eFUSE 寄存器的读/写保护。下表提供了位说明和推荐设置。

eFUSE 控制寄存器位 (FUSE_CNTL) 描述
少量位名称描述推荐设置
0R_DIS_Key当编程为 1 时,该位将禁用验证 AES 密钥和 AES 密钥编程的 CRC 校验。

是(编程为 1)

1R_DIS_USER该位设置为 1 时,将禁用读取 FUSE_USER 用户代码。这不会禁用通过 EFUSE_USR 组件读取用户代码,但会禁用通过 JTAG 端口读取用户代码。

(保持为 0)

2R_DIS_SEC当编程为 1 时,该位禁用通过 JTAG 读取 FUSE_SEC 安全设置。

是(编程为 1)

3–4保留保留
5工作指示

当编程为 1 时,该位将禁用 FUSE_CNTL 位的编程。

建议:在编程 FUSE_CNTL 寄存器位后将此位编程为 1,以防止对 FUSE_CNTL eFUSE 位进行意外更改。

是(编程为 1)

6R_DIS_RSA当编程为 1 时,该位禁用读取 FUSE_RSA 认证密钥。

是(编程为 1)

7写入磁盘密钥

当编程为 1 时,该位将禁用 AES 密钥的编程和验证密钥的 CRC 校验。

建议:在编程密钥后对此位进行编程,以防止对 eFUSE AES 密钥值进行意外更改/损坏。

是(编程为 1)

8W_DIS_USER禁用 FUSE_USER 用户代码的编程。

(保持为 0)

9工作区

当编程为 1 时,该位将禁用 FUSE_SEC 寄存器位的编程。

建议:在对 FUSE_SEC 寄存器进行编程后对此位进行编程,以防止对 FUSE_SEC 寄存器进行意外更改/损坏。

是(编程为 1)

10–14保留保留
15W_DIS_RSA当编程为 1 时,该位禁用 FUSE_RSA 认证密钥的编程。待处理的客户安全要求
16W_DIS_USER_128当编程为 1 时,该位禁用 FUSE_USER_128 用户代码的编程。
17–23保留保留的UltraScale位延伸至位 20,保留的UltraScale+位延伸至位 23。

eFUSE 安全寄存器 (FUSE_SEC) 描述

该寄存器包含用户可编程位,用于选择 eFUSE 安全设​​置并启用 RSA 身份验证(如果需要)。下表提供了位说明和推荐设置。

eFUSE 控制寄存器位 (FUSE_SEC) 描述
少量位名称描述推荐设置
0

FUSE_SHAD_SEC[0] (CFG_AES_Only)

仅允许加密的比特流。
如果此位被编程为 1,则除非已知 AES 密钥,否则无法使用器件。如果此位被编程,则无法接受退货授权 (RMA) 退货,并且无法使用Vivado间接 SPI/BPI 闪存编程流程。如果您打算使用Vivado进行此类编程,则必须在熔断此保险丝之前对外部配置存储器进行编程。
否(保持为 0)
建议:保留 0 个待处理的客户安全要求。
1FUSE_SHAD_SEC[1]强制使用存储在 eFUSE 中的 AES 密钥(BBRAM 密钥已禁用)。当此位未编程时,可以通过比特流选项选择加密和密钥源——FPGA 可以配置为使用未加密的比特流,或使用存储在电池供电 RAM (BBRAM) 或 eFUSE 中的密钥值加密的比特流。否(保持为 0)
2RSA 身份验证强制 RSA 身份验证。
如果此位被编程为 1,则除非已知 RSA 密钥,否则无法使用器件。如果此位被编程,则无法接受退货授权 (RMA) 退货,并且无法使用Vivado间接 SPI/BPI 闪存编程流程。如果您打算使用Vivado进行此类编程,则必须在熔断此保险丝之前对外部配置存储器进行编程。
待处理的客户安全要求
4扫描禁用禁用AMD测试访问。否(保持为 0)
5CRYPT_DISABLE永久禁用解密器。否(保持为 0)
6FUSE_BKS_ENABLE启用密钥混淆。由Vivado Design Suite自动设置
7–31保留保留-
  • 当 FUSE_SHAD_SEC[0:1] 未被编程时:
    • 可以通过比特流选项启用或禁用加密。
    • 可以通过比特流选项选择存储在 eFUSE 或电池支持的 SRAM (BBRAM) 中的 AES 密钥。
  • 当 FUSE_SHAD_SEC[1:0] 被编程时。
    • 只有使用 eFUSE 密钥加密的比特流才能用于通过外部配置端口配置 FPGA。
当 FUSE_SHAD_SEC[0] 或 RSA_AUTH 被编程时,只有 AES 加密或 RSA 认证比特流才能通过外部配置端口配置 FPGA。这排除了使用AMD测试比特流和AMD预构建比特流进行设备配置的可能性。因此,AMD不接受退回材料授权 (RMA) 请求,也不支持对已编程 FUSE_SHAD_SEC[0] 或 RSA_AUTH 位的设备进行间接闪存编程。

创建加密密钥和加密比特流

Vivado工具提供的比特流生成器 (write_bitstream)可以生成加密和非加密比特流。对于 AES 比特流加密,请设置 write_bitstream 属性以启用比特流加密。您可以指定一个自定义的 256 位密钥作为比特流生成器的输入(这是AMD 的建议,也是最安全的方法),或者您也可以让Vivado工具为您生成一个伪随机密钥(不推荐)。

重要的:

对于 3D IC 器件,您必须为每个 SLR 分配一个包含唯一密钥的 NKY 文件。当您尝试为所有 SLR 分配单个 AES 密钥或为所有 SLR 分配单个 AES/IV 对时, Vivado硬件管理器会发出严重警告。这两种情况都会引入安全漏洞。

有关使用唯一加密密钥集的重要更新,请参阅答复记录71558、答复记录000036543和答复记录000033700。请参阅下方#vtx1717106533372__codeblock_dvz_gfb_qbc中的 3D IC NKY 文件示例。

比特流生成器会生成一个加密的比特流文件 (.BIT) 和一个加密密钥文件 (.NKY)。下表列出了可在 XDC 文件中定义的 write_bitstream 属性及其相应的描述。有关Vivado集成设计环境 (IDE) 中密钥创建和比特流加密的示例,请参阅《 Vivado 设计套件用户指南:编程和调试》 ( UG908 )。

Write_bitstream 属性
Write_bitstream 属性默认值可能的值描述
比特流.加密.加密否或是加密比特流。
比特流.加密.加密密钥选择布拉姆bbram 或 eFUSE确定要使用的 AES 加密密钥的位置,可以是电池供电的 RAM (BBRAM) 或 eFUSE 寄存器。
注意:仅当 加密选项设置为 True时,此属性才可用。
比特流.加密.密钥寿命三十二4至2,147,483,647指定 AES-GCM 认证比特流中应使用单个密钥的 128 位加密块的数量。默认值为 32,会使比特流大小或比特流长度增加约 2 倍。当 BITSTREAM.AUTHENTICATION. AUTHENTICATE = 否时使用
比特流.加密.密钥0挑选

选择或<256 位十六进制字符串>

Key0 设置比特流加密的 AES 加密密钥。要使用此选项,必须先将“加密”设置为“是”。
比特流.加密.密钥文件没有任何<字符串>指定输入加密文件的名称(文件扩展名为 .nky)。要使用此选项,必须先将“加密”设置为“是”。
比特流.加密.RSAKEYLIFEFRAMES88至2,147,483,647指定在指定 RSA 公钥认证的情况下,任何给定的 AES-256 密钥应使用多少个配置帧。8 个配置帧的值相当于使用 246 个加密块的密钥。当 BITSTREAM.AUTHENTICATION 设置为“是”时使用。AUTHENTICATE 设置为“是”
比特流.加密.启动IV0挑选选择或<128 位十六进制字符串>用于指定第一条 AES-GCM 消息中初始 GCM 计数值的初始化向量。128 位十六进制值。仅使用 128 个十六进制值的前 96 位。后 32 位将被丢弃。
比特流加密启动混淆挑选选择或<128 位十六进制字符串>起始混淆初始向量(混淆 IV0)值。仅使用 128 个十六进制值的前 96 位。后 32 位将被丢弃。
比特流.身份验证.身份验证是还是不是指示是否使用 RSA 身份验证。如果否,则使用 AES-GCM 固有的身份验证。
BITSTREAM.AUTHENTICATION.RSAPRIVATEKEYFILE没有任何<字符串>指定包含用于签署 RSA-2048 认证比特流的密钥对的 OpenSSL .pem 文件。
比特流加密混淆密钥禁用启用或禁用创建比特流,用于加密比特流的密钥在写入 eFUSE 或电池供电 RAM (BBRAM) 之前会进行混淆处理。这允许用户向设备编程器提供混淆密钥,而非原始客户密钥。然后,设备编程器可以将混淆密钥写入 eFUSE 或 BBRAM,并使用所选存储位置中的混淆密钥标记将其标记为已混淆。
建议:请参阅答复记录 000033701,了解比​​特流参数,以确保足够水平的侧信道分析 (SCA) 阻力。

以下特定的 XDC 文件代码片段展示了 BBRAM 密钥存储和定义的自定义密钥。如果您希望工具生成伪随机密钥,则需要注释掉该BITSTREAM.ENCRYPTION.KEY0属性。这还显示已启用 RSA 身份验证,并将 RSA 密钥有效期设置为默认值 8。注释掉这些内容即可禁用 RSA 身份验证功能。所有显示的属性也可通过“编辑设备属性” GUI 进行选择和编辑。

#Encryption settings

set_property BITSTREAM.ENCRYPTION.ENCRYPT YES [current_design]

#set_property BITSTREAM.ENCRYPTION.ENCRYPTKEYSELECT EFUSE [current_design] set_property BITSTREAM.ENCRYPTION.ENCRYPTKEYSELECT BBRAM [current_design]

set_property BITSTREAM.ENCRYPTION.OBFUSCATEKEY Enable [current_design]

set_property BITSTREAM.ENCRYPTION.KEYLIFE 32 [current_design]

set_property BITSTREAM.ENCRYPTION.KEY0 256'h1234567812345678123456781234567812345678123456781234567812345678 [current_design] set_property BITSTREAM.ENCRYPTION.STARTIV0 128'h87654321876543218765432187654321 [current_design]

set_property BITSTREAM.ENCRYPTION.STARTIVOBFUSCATE 128'hABCDABCDABCDABCDABCDABCDABCDABCD[current_design]

set_property BITSTREAM.ENCRYPTION.FAMILY_KEY_FILEPATH

C:/<any directory>/familyKey_us.cfg [current_design] #Authentication settings

set_property BITSTREAM.AUTHENTICATION.AUTHENTICATE YES [current_design]

set_property BITSTREAM.ENCRYPTION.RSAKEYLIFEFRAMES 8 [current_design]

set_property BITSTREAM.AUTHENTICATION.RSAPRIVATEKEYFILE {C:config/ultrascale/encryption/encryption_test/encryption_test.runs/impl_1/rsa.pem} [current_design]

NKY 文件生成与比特流生成同时进行。此文件采用与比特文件相同的顶级名称,并与加密比特流位于同一实现目录中。单片设备的 NKY 文件格式为:

Device <type>;

EncryptKeySelect <type>;

StartIvObfuscate 00000000000000000000000000000000;

RsaPublicKeyDigest 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;

Key0 0000000000000000000000000000000000000000000000000000000000000000;

StartIV0 00000000000000000000000000000000;

对于 3D IC 设备,NKY 文件格式KeyStartIV语句扩展了第二个值,指示目标 SLR 指数。

Device <type>;

EncryptKeySelect <type>;

StartIvObfuscate 00000000000000000000000000000000;

RsaPublicKeyDigest 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;

Key0 0000000000000000000000000000000000000000000000000000000000000000, 0;

StartIV0 00000000000000000000000000000000, 0;

Key0 0000000000000000000000000000000000000000000000000000000000000000, 1;

StartIV0 00000000000000000000000000000000, 1;

向量大小
范围向量大小(十六进制)
启动IVObfuscate128小时
RsaPublicKeyDigest384'小时
键0256'小时
启动IV032'小时

例如:(top.nky,单片设备)

Device xcvu095;

EncryptKeySelect BBRAM;

StartIvObfuscate abcdabcdabcdabcdabcdabcdabcdabcd;

RsaPublicKeyDigest 6DF61AA1636F1FF8A35D064CED96918A6D4820D3CAEEFFA47F64F5C58AC2E539CA3A53103C86450EC576AD595AB3A528;

Key0 1234567812345678123456781234567812345678123456781234567812345678;

StartIV0 876543218765432187654321000003f8;

Key1 44a619e399910767e68cb81bcbae831bd5d10a96e5a348420e9384eb0df06111;

StartIV1 b152ef23b9481138af45a21a000003d8;

.

.

.

Key4063 ddd9955fae4847a54d10a1c06a52171cf69e3593220018c2cac4ca56bf359f5c;

StartIV4063 7d94e42bf79ab77cce1a1d8300000382;

RSA 认证 PEM 文件,示例语法:

-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAvCMmT6/MM9LxXs7ZxybE4wKACvp0S2EpWy/q+wFkjeev/oT1EZkyRkeCLWKwLaTUeGxFYeWCVFhpHH7PU9d/5HudIsV

r/uJ8k/V7GASsj/8EL3O+RFoMdpsv6AFFD8desse3svR2d3yWlnrWLKfSd25DLqOg5fHMauV5DwDpsrbUvBf/ZOW5JWd4iyi0oeK1/Dw/91

AYiJoRWmKt6s3IH1ZkX4OfoXMBJ+SnVgV9NIm59lOb0vd0ZZtNOqo1oX/Ekn93jwoD1UbHAWN90TfZSIAqsv2c4aeC342jKrHUq4cykK

.

.

.

xuTbhBadZaq8u8TGsXO3oPvI+p2tee5sNNoleJj3/gnkPtF9od5bqo8=

-----END RSA PRIVATE KEY-----

加载加密密钥

BBRAM 和 eFUSE 256 位对称密钥只能使用Vivado设备编程器工具通过 JTAG 接口加载到设备上。对于UltraScale设备,此密钥加载路径对设备而言是只写的。没有物理数据路径可以读回任何密钥。当通过 JTAG 将密钥写入设备时,将通过将预期的 CRC32 值通过 JTAG 写入设备来启动密钥完整性检查。设备(内部)会根据存储的密钥计算实际的 CRC32 完整性检查,并将其与刚刚通过 JTAG 端口接收到的预期 CRC32 进行比较。然后,设备将通过/失败类型的结果(而不是实际的密钥数据)写入 JTAG 端口,以表示完整性状态。移除密钥的物理读回路径可提高存储密钥的安全性。

BBRAM关键编程解决方案包括:

  • Vivado设备编程器工具和 JTAG 电缆的使用
    注意:对于基于 BBRAM 的密钥,在写入密钥之前,BBRAM 中的现有密钥将被清零(擦除并验证)。

eFUSE 密钥编程解决方案包括:

  • AMD编程
    • AMD测试中心的全自动在线 ATE 流程
    • 安全编程,适用于中到高容量——采用统一设置
  • 安富利编程
    • 安全性、处理、序列化和其他差异化的机会
    • 非常适合从中等音量到低音量进行编程
  • 客户制造流程
    • 第三方工具,或集成在设计中BBRAM 和 eFUSE 的内部编程(XAPP1283),使用AMD编程技术
    • 非常适合定制要求,包括高度机密信息处理
建议:对于 eFUSE 解决方案,还建议对 AES 密钥进行系统内编程采取以下预防措施:
  • 防止或清除 FPGA 的配置设计,以最大限度地减少 FPGA 内的电源噪声。
  • 如果可能,请停止板级系统时钟以最大限度地减少系统电源噪声。

使用Vivado硬C,右键单击UltraScale FPGA 以选择程序 BBR 密钥...或 程序 eFUSE 寄存器...,具体取决于您之前选择的存储选项(见下图)。

Vivado HW_Manager 密钥编程选择

BBRAM

选择“Program BBR Key...”后,您可以浏览到项目目录中最近生成的 NKY 文件。添加 NKY 文件后,您还可以仔细检查密钥值,并确认这是您打算编程到设备中的 AES 密钥。(参见下图。)

BBRAM 编程 GUI
注意:如果由于在 write_bitstream 之前启用了 BITSTREAM.ENCRYPTION.OBFUSCATEKEY 属性而导致 NKY 文件包含一个字段,则在对 AES-256 密钥进行编程期间,Vivado KeyObfuscate软件会自动设置 eFUSE 或 BBRAM 中的混淆密钥标志。

启用 DPA_PROTECT 复选框启用 BBRAM 配置计数 DPA 保护机制。

  • DPA_COUNT 指定配置计数器的初始加载值。一旦计数达到 0,BBRAM 就会被擦除。
  • DPA_MODE 指定在什么条件下应减少 DPA_COUNT。有两个选项:INVALID_CONFIGURATIONS(典型的 DPA 设置)和 ALL_CONFIGURATIONS(每次配置时都会减少 DPA_COUNT 的计数,以确保设备有固定数量的配置可供使用)。

电子保险丝

当您选择“编程 eFUSE 寄存器...”时,将出现一个向导,引导您完成选择 NKY 文件和要编程的各种 eFUSE 寄存器的过程。添加 NKY 或 PEM 文件后,您还可以仔细检查密钥值,并确认这些密钥是您打算编程到器件中的 AES 和 RSA 密钥。(参见下图。)

eFUSE 编程加密密钥设置

用户寄存器设置屏幕如下图所示。您可以指定一个唯一的 32 位和/或 128 位值,并将其编程到 FUSE_USER 寄存器位中。这些寄存器可以通过 eFUSE_USR 原语从 FPGA 逻辑读取。

eFUSE 编程用户寄存器设置

控制寄存器设置屏幕如下图所示。您可以通过该屏幕选择要编程的 FUSE_CNTL 寄存器位。这些​​位通过禁用不同 eFUSE 控制寄存器上的读写操作来确保安全性。

注意:有关控制寄存器位描述和推荐设置,请参阅 表 1 。
eFUSE 编程控制寄存器设置

安全寄存器设置屏幕如下图所示。您可以选择要编程的 FUSE_SEC 寄存器位。这些​​位通过仅允许加密比特流或启用 RSA 身份验证来提供额外的安全性。

注意:有关安全寄存器位描述和推荐设置,请参阅 表 1 。
eFUSE 编程安全寄存器设置
注意:如果由于在 write_bitstream 之前启用了 BITSTREAM.ENCRYPTION.OBFUSCATEKEY 属性而导致 NKY 文件包含一个字段,则在对 AES-256 密钥进行编程期间,Vivado KeyObfuscate软件会自动设置 eFUSE 或 BBRAM 中的混淆密钥标志。
下图所示的最后一个屏幕是“摘要”屏幕,您可以使用它来验证您选择的选项是否是您想要实施的选项。
重要提示:请记住,eFUSE 寄存器是一次性可编程的,以后不能更改。
概括

加载加密比特流

使用正确的加密密钥对器件进行编程后,即可使用加密比特流进行配置。使用加密比特流进行配置后,无论比特流安全设置如何,都无法通过 JTAG 或 SelectMAP 回读读取配置存储器。尽管器件持有加密密钥,但可以使用非加密比特流配置器件(仅当 FUSE_SHAD_SEC[0] 位未编程时),并且仅在 INIT_B 或 PROGRAM_B 置位后才能使用,从而清除配置存储器。在这种情况下,密钥将被忽略。使用非加密比特流进行配置后,可以进行回读(如果 write_bitstream 安全设置允许)。但是,仍然无法从器件中读出加密密钥,从而防止使用特洛伊木马比特流破解UltraScale FPGA 加密方案。

所有受支持的配置方法均不受加密影响。UltraScale FPGA 不允许同时使用压缩和 RSA 身份验证创建比特流。加密比特流可以通过任何配置接口传输:JTAG、串行、SPI、BPI、SelectMAP 或 ICAPE3。配置完成后,如果不切换 PROGRAM_B 引脚、循环上电或发出 IPROG 或 JPROGRAM 指令,则无法重新配置器件。即使启用加密,Fallback 和 IPROG 重新配置仍会启用。Fallback 和 IPROG 重新配置映像可以是加密的,也可以是未加密的。可通过 ICAPE3 原语进行读回。如果 V BATT或 V CCAUX保持稳定,则上述事件均不会重置 BBRAM 密钥。

如果加密比特流中的密钥与器件中存储的密钥不匹配,则会导致配置失败,此时 INIT_B 引脚将先脉冲为低电平,如果启用了回退功能,则脉冲回升至高电平,而 DONE 引脚则保持低电平。加密比特流支持高级配置解决方案,例如串联配置和部分重配置。部分比特流可以以未加密的形式传输到 ICAP,也可以加密(使用相同的 AES 密钥)传输到任何配置端口,只要后者未被设计人员明确禁止。设置安全级别 2(通过 set_property BITSTREAM.READBACK.SECURITY Level2 [current_design] 实现)或将 FUSE_SHAD_SEC[0] 的“CFG_AES_Only”位编程为 ,1可防止通过外部配置端口进行部分重配置。

重要提示:必须通过以下配置接口之一对 RSA 认证加密比特流进行编程:SelectMAP、SPI 或 BPI。不支持使用Vivado HW Manager 对 RSA 认证比特流进行直接 JTAG 编程。对于支持 RSA 认证的UltraScale FPGA 器件和配置模式,请参阅《UltraScale 架构配置用户指南》 (  UG570 )中的“RSA 认证”部分。

eFUSE 编程一般建议

对 eFUSE 编程项目应用以下建议:

  • 要求:使用Vivado Design Suite 2017.1 或更新版本。
  • 建议:如果电路板设计允许,则在 eFUSE 编程期间将 FPGA 配置模式引脚设置为仅 JTAG 设置。
  • 要求:使用单独的 eFUSE 编程操作,例如,单独通过编程 eFUSE GUI 向导或单独的 Tcl 命令,按照以下顺序编程适用的 eFUSE 值和选项:
    1. 编程 eFUSE 操作步骤 #1:编程 NKY 值(AES、RSA)和 FUSE_USER 值。
    2. 编程 eFUSE 操作步骤 #2:(如果适用)对安全寄存器 (FUSE_SEC) 选项进行编程,JTAG 禁用除外。
    3. 编程 eFUSE 操作步骤 #3:(如果适用)对控制寄存器(FUSE_CNTL)选项进行编程,但 W_DIS_CNTL(写入禁用控制寄存器)除外。
      注意:如果需要在最后一步(5)中对安全寄存器 JTAG 禁用选项进行编程,请不要对控制寄存器 W_DIS_SEC 选项进行编程。
    4. 编程 eFUSE 操作步骤 #4:(如果适用)编程控制寄存器 W_DIS_CNTL(写入禁用 FUSE_CNTL 寄存器)。请参阅 Vivado Design Suite 用户指南:编程和调试(UG908)。
    5. 最后一次编程 eFUSE 操作步骤:(如适用)编程安全寄存器 JTAG 禁用。请参阅Vivado Design Suite 用户指南:编程和调试( UG908 )。
  • 建议:对于第一个编程的设备,在完成上述每个步骤后验证 eFUSE 结果,然后在完成所有步骤后重新验证 eFUSE 结果,以确保完整的 eFUSE 编程过程的最终结果符合预期。
  • 如果已编程 AES 和/或 RSA 值,则验证设备是否成功加载 AES 加密和/或 RSA 签名的比特流。
  • 如果 FUSE_USER 值已被编程,则验证您是否读取了正确的 JTAG FUSE_USER 和/或 EFUSE_USER 原始值。
  • 如果对 FUSE_SEC 设置进行了编程,则验证所选设置是否具有正确的设备行为。
  • 如果对 FUSE_CNTL 设置进行了编程,则检查Vivado中生成的 REGISTERS.EFUSE.FUSE_CNTL 值以验证设置,并检查Vivado中受读保护的 REGISTER.EFUSE.* 寄存器是否显示您的实际值。
    注意:预计Vivado将显示一些 FUSE_CNTL 保留位位置,这些位置之前已由AMD工厂编程为“1”。
  • 根据步骤 5 的选择,验证您是否可以访问设备 JTAG。

硬件验证

您很可能需要验证 AES 密钥是否已正确写入 BBRAM 或 eFUSE 位。以下是验证步骤的清单:
  1. 使用Vivado 2017.1 或更高版本生成比特流:未加密的比特流、使用您的个性化密钥的加密比特流、使用全一密钥的加密比特流以及使用全零密钥的加密比特流。
  2. 检查生成的比特流以验证是否发生了加密。
  3. 检查硬件:使用Vivado Device Programmer 连接到 FPGA,通过 JTAG 下载未加密的 bit 文件。验证设计是否按预期运行。
  4. 测试 FPGA 解密器:下载使用全零密钥(用于 eFUSE)加密的 .bit 文件。
  5. 按照上一节中的建议,通过 JTAG 对 AES 密钥进行编程。(如果使用 eFUSE,请先使用 BBRAM 密钥执行步骤 5 和 6,进行验证检查;如果一切正常,则对 eFUSE 进行编程以进行最终测试。)
  6. 测试密钥:使用您的个性化密钥下载加密的 .bit 文件。
  7. 测试密钥:下载使用全零密钥加密的 .bit 文件(预计失败)。
  8. 测试密钥设置:下载未加密的 .bit 文件(结果可能因安全设置而异)。
  9. 检查密钥安全性:检查密钥是否具有读保护。

结论

本应用笔记介绍了UltraScale FPGA AES 加密和身份验证标准。它介绍了不同密钥存储选项的优缺点。最重要的是,它提供了一个简单的指南,指导您如何创建加密的比特文件以及加密和身份验证密钥,以及如何使用Vivado软件将这些文件编程到UltraScale FPGA中。

查找其他文档

技术信息门户

AMD技术信息门户是一款在线工具,可通过 Web 浏览器提供强大的文档搜索和导航功能。要访问技术信息门户,请访问https://docs.amd.com。

文档导航器

文档导航器 (DocNav) 是一款已安装的工具,可让您访问AMD自适应计算文档、视频和支持资源,并可进行筛选和搜索以查找信息。要打开 DocNav,请执行以下操作:

  • 从AMD Vivado™ IDE 中,选择 帮助>文档和教程。
  • 在 Windows 上,单击“开始”按钮并选择 Xilinx 设计工具> DocNav。
  • 在 Linux 命令提示符下,输入docnav
注意:有关 DocNav 的更多信息,请参阅文档导航器用户指南(  UG968 )。

设计中心

AMD设计中心提供按设计任务和其他主题组织的文档链接,您可以使用这些链接了解关键概念并解答常见问题。访问设计中心的方法如下:

  • 在 DocNav 中,单击设计中心视图选项卡。
  • 转到设计中心网页。

参考

这些文档提供了对本指南有用的补充材料:

  1. 高级加密标准 (AES) ( FIPS PUB 197 )
  2. 伽罗瓦/计数器操作模式(GCM)(规范)
  3. UltraScale 架构配置用户指南( UG570 )
  4. Vivado Design Suite 用户指南:编程和调试(UG908)
  5. 使用 UltraScale 和 UltraScale+ FPGA 开发防篡改设计( XAPP1098 )
  6. OpenSSL(www.openssl.org)
  7. BBRAM 和 eFUSE 的内部编程( XAPP1283 )
  8. UltraScale FPGA RSA 身份验证和支持配置模式( XCN15038 )
  9. UltraScale/UltraScale+ FPGA 系列设计咨询:RSA 身份验证漏洞 (JustSTART) ( 000036039 )
  10. UltraScale RSA 身份验证的设计咨询 - 使用 RSA 身份验证的 UltraScale 设备在使用较小配置接口宽度时将无法通过比特流身份验证(AMD设计咨询65792)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity3D仿星露谷物语开发44之收集农作物

1、目标 在土地中挖掘后&#xff0c;洒下种子后逐渐成长&#xff0c;然后使用篮子收集成熟后的农作物&#xff0c;工具栏中也会相应地增加该农作物。 2、修改CropStandard的参数 Assets -> Prefabs -> Crop下的CropStandard&#xff0c;修改其Box Collider 2D的Size(Y…

list重点接口及模拟实现

list功能介绍 c中list是使用双向链表实现的一个容器&#xff0c;这个容器可以实现。插入&#xff0c;删除等的操作。与vector相比&#xff0c;vector适合尾插和尾删&#xff08;vector的实现是使用了动态数组的方式。在进行头删和头插的时候后面的数据会进行挪动&#xff0c;时…

CE17.【C++ Cont】练习题组17(堆专题)

目录 1.P2085 最小函数值 题目 分析 方法1:暴力求解 方法2:二次函数的性质(推荐!) 代码 提交结果 2.P1631 序列合并 分析 方法1:建两个堆 第一版代码 提交结果 第二版代码 提交结果 第三版代码 提交结果 方法2:只建一个堆 代码 提交结果 1.P2085 最小函数值…

题单:表达式求值1

题目描述 给定一个只包含 “加法” 和 “乘法” 的算术表达式&#xff0c;请你编程计算表达式的值。 输入格式 输入仅有一行&#xff0c;为需要计算的表达式&#xff0c;表达式中只包含数字、加法运算符 和乘法运算符 *&#xff0c;且没有括号。 所有参与运算的数字不超过…

DeepSeek超大模型的高效训练策略

算力挑战 训练DeepSeek此类千亿乃至万亿级别参数模型,对算力资源提出了极高要求。以DeepSeek-V3为例,其基础模型参数量为67亿,采用专家混合(MoE)架构后实际激活参数可达几百亿。如此规模的模型远超单张GPU显存容量极限,必须借助分布式并行才能加载和训练。具体挑战主要包…

MFC中DoDataExchange的简明指南

基本概念 DoDataExchange 是 MFC 框架中实现数据自动同步的核心函数&#xff0c;主要用于对话框中控件与成员变量的双向绑定。它能让控件中的数据和成员变量自动保持一致&#xff0c;无需手动读写控件数据。 使用示例 1&#xff09;变量声明 在对话框头文件中声明与控件对应…

FreeCAD源码分析: Transaction实现原理

本文阐述FreeCAD中Transaction的实现原理。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 一、概念 Ref. from What is a Transaction? A transaction is a group of operations that have the f…

C++类与对象--1 特性一:封装

C面向对象三大特性&#xff1a; &#xff08;1&#xff09;封装&#xff1b;&#xff08;2&#xff09;继承&#xff1b;&#xff08;3&#xff09;多态&#xff1b; C认为万物皆是对象&#xff0c;对象上有对应的属性&#xff08;数据&#xff09;和行为&#xff08;方法&…

初探Reforcement Learning强化学习【QLearning/Sarsa/DQN】

文章目录 一、Q-learning现实理解&#xff1a;举例&#xff1a;回顾&#xff1a; 二、Sarsa和Q-learning的区别 三、Deep Q-NetworkDeep Q-Network是如何工作的&#xff1f;前处理&#xff1a;Convolution NetworksExperience Replay 一、Q-learning 是RL中model-free、value-…

WebRTC技术EasyRTC嵌入式音视频通信SDK打造远程实时视频通话监控巡检解决方案

一、方案概述​ 在现代工业生产、基础设施维护等领域&#xff0c;远程监控与巡检工作至关重要。传统的监控与巡检方式存在效率低、成本高、实时性差等问题。EasyRTC作为一种先进的实时音视频通信技术&#xff0c;具备低延迟、高稳定性、跨平台等特性&#xff0c;能够有效解决这…

专题四:综合练习(括号组合算法深度解析)

以leetcode22题为例 题目分析&#xff1a; 给一个数字n&#xff0c;返回合法的所有的括号组合 算法原理分析&#xff1a; 你可以先考虑如何不重不漏的罗列所有的括号组合 清楚什么是有效的括号组合&#xff1f;&#xff1f;&#xff1f; 1.所有的左括号的数量等于右括号的…

星云智控自定义物联网实时监控模板-为何成为痛点?物联网设备的多样化-优雅草卓伊凡

星云智控自定义物联网实时监控模板-为何成为痛点&#xff1f;物联网设备的多样化-优雅草卓伊凡 引言&#xff1a;物联网监控的模板革命 在万物互联的时代&#xff0c;设备监控已成为保障物联网系统稳定运行的核心环节。传统的标准化监控方案正面临着设备类型爆炸式增长带来的…

5.27本日总结

一、英语 复习list2list29 二、数学 学习14讲部分内容 三、408 学习计组1.2内容 四、总结 高数和计网明天结束当前章节&#xff0c;计网内容学完之后主要学习计组和操作系统 五、明日计划 英语&#xff1a;复习lsit3list28&#xff0c;完成07年第二篇阅读 数学&#…

几种运放典型应用电路

运算放大器简称:OP、OPA、OPAMP、运放。 一、电压跟随器 电压跟随器顾名思义运放的输入端电压与运放的输出电压相等 这个电路一般应用目的是增加电压驱动能力: 比如说有个3V电源,借一个负载,随着负载电流变大,3V就会变小说明3V电源带负载能力小,驱动能力弱,这个时候…

Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析

1. 引言 在 Android 系统中&#xff0c;ActivityManagerService (AMS)、WindowManagerService (WMS) 和 PackageManagerService (PMS) 是三个最核心的系统服务&#xff0c;它们分别管理着应用的生命周期、窗口显示和应用包管理。 但你是否知道&#xff0c;这些服务并不是独立…

从另一个视角理解TCP握手、挥手与可靠传输

本文将深入探讨 TCP 协议中三次握手、四次挥手的原理&#xff0c;以及其保证可靠传输的机制。 一、三次握手&#xff1a;为何是三次&#xff0c;而非两次&#xff1f; 建立 TCP 连接的过程犹如一场严谨的 “对话”&#xff0c;需要经过三次握手才能确保通信双方的可靠连接。 三…

将Docker compose 部署的夜莺V6版本升到V7版本的详细步骤、常见问题解答及相关镜像下载地址

环境说明 夜莺官网&#xff1a;首页 - 快猫星云Flashcat 夜莺安装程序下载地址&#xff1a;快猫星云下载中心 夜莺v7.7.2镜像&#xff08;X86架构&#xff09;&#xff1a; https://download.csdn.net/download/jjk_02027/90851161 夜莺ibex v1.2.0镜像&#xff08;X86架构…

JavaScript【4】数组和其他内置对象(API)

1.数组: 1.概述: js中数组可理解为一个存储数据的容器,但与java中的数组不太一样;js中的数组更像java中的集合,因为此集合在创建的时候,不需要定义数组长度,它可以实现动态扩容;js中的数组存储元素时,可以存储任意类型的元素,而java中的数组一旦创建后,就只能存储定义类型的元…

永久免费!专为 Apache Doris 打造的可视化数据管理工具 SelectDB Studio V1.1.0 重磅发布!

作为全球领先的开源实时数据仓库&#xff0c; Apache Doris Github Stars 已超过 13.6k&#xff0c;并在 5000 余家中大型企业生产环境得到广泛应用&#xff0c;支撑业务核心场景&#xff0c;成为众多企业数据分析基础设施不可或缺的重要基座。过去&#xff0c;Apache Doris 用…

数字万用表与指针万用表使用方法及注意事项

在电子测量领域&#xff0c;万用表是极为常用的工具&#xff0c;数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项&#xff0c;能确保测量的准确性与安全性。下面为您详细介绍&#xff1a; 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […