|
8 | 8 |
|
9 | 9 | {IDF_TARGET_NAME} 中包含一个硬件随机数发生器 (RNG),可以调用 API :cpp:func:`esp_random` 和 :cpp:func:`esp_fill_random` 从中获取随机数值。 |
10 | 10 |
|
| 11 | +系统从随机数生成器的 RNG_DATA_REG 寄存器中读取的每一个 32 位数值都是一个真正的随机数。这些真正的随机数是基于系统中的热噪声和异步时钟失配生成的。 |
| 12 | + |
| 13 | +.. only:: SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED |
| 14 | + |
| 15 | + - 热噪声来自高速 ADC、SAR ADC 或两者。当高速 ADC 或 SAR ADC 被启用时,会生成比特流,并作为随机种子通过 XOR 逻辑门输入到随机数生成器中。 |
| 16 | + |
| 17 | +.. only:: not SOC_WIFI_SUPPORTED and not SOC_IEEE802154_SUPPORTED and not SOC_BT_SUPPORTED |
| 18 | + |
| 19 | + - 热噪声来自 SAR ADC。当 SAR ADC 被启用时,会生成比特流,并作为随机种子通过 XOR 逻辑门输入到随机数生成器中。 |
| 20 | + |
| 21 | +.. only:: not esp32 |
| 22 | + |
| 23 | + - RC_FAST_CLK 是一种异步时钟源,它通过引入电路亚稳态来增加 RNG 的熵值。详细信息请参阅 :ref:`secondary entropy` 部分。 |
| 24 | + |
| 25 | +下图展示了 {IDF_TARGET_NAME} 上 RNG 的噪声来源: |
| 26 | + |
| 27 | +.. only:: SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED |
| 28 | + |
| 29 | + .. image:: /../_static/esp_rng_noise_source_rf_available.svg |
| 30 | + :align: center |
| 31 | + |
| 32 | +.. only:: not SOC_WIFI_SUPPORTED and not SOC_IEEE802154_SUPPORTED and not SOC_BT_SUPPORTED |
| 33 | + |
| 34 | + .. image:: /../_static/esp_rng_noise_source_rf_unavailable.svg |
| 35 | + :align: center |
| 36 | + |
11 | 37 | 满足下列任意一个或多个条件时,硬件 RNG 会产生真随机数: |
12 | 38 |
|
13 | 39 | .. list:: |
14 | 40 |
|
15 | | - :SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED: - RF 子系统已启用,即 {IDF_TARGET_RF_NAME} {IDF_TARGET_RF_IS}。 |
| 41 | + :SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED: - RF 子系统,即 {IDF_TARGET_RF_NAME} {IDF_TARGET_RF_IS}。启用后,RF 子系统会在内部启用高速 ADC,该 ADC 可用作熵源。高速 ADC 可能仅在相应的 RF 子系统处于活动状态(例如未处于睡眠模式)时可用。详细信息请参阅 :ref:`enabling RF subsystem` 部分。 |
16 | 42 | - 调用 :cpp:func:`bootloader_random_enable` 启用了内部熵源 (SAR ADC),且熵源尚未被 :cpp:func:`bootloader_random_disable` 禁用。 |
17 | 43 | - 在 :ref:`second-stage-bootloader` 运行时。这是因为默认的 ESP-IDF 引导加载程序启动时会调用 :cpp:func:`bootloader_random_enable`,并在执行应用程序前调用 :cpp:func:`bootloader_random_disable`。 |
18 | 44 |
|
19 | 45 | 当上述任一条件为真时,物理噪声样本会连续混合到内部硬件 RNG 状态中来提供熵。如需了解详情,请参阅 **{IDF_TARGET_NAME} 技术参考手册** > **随机数发生器 (RNG)** [`PDF <{IDF_TARGET_TRM_CN_URL}#rng>`__] 章节。 |
20 | 46 |
|
21 | 47 | 如果上述条件都不满足,那么 RNG 的输出仅应被看作伪随机数。 |
22 | 48 |
|
| 49 | +.. only:: SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED |
| 50 | + |
| 51 | + .. _enabling RF subsystem: |
| 52 | + |
| 53 | + 启用 RF 子系统 |
| 54 | + --------------- |
| 55 | + |
| 56 | + 可以通过以下任一 API 来启用 RF 子系统: |
| 57 | + |
| 58 | + .. list:: |
| 59 | + |
| 60 | + :SOC_WIFI_SUPPORTED: - Wi-Fi: :cpp:func:`esp_wifi_start` |
| 61 | + :SOC_BT_SUPPORTED: - 蓝牙 (NimBLE): :cpp:func:`nimble_port_init()` 会在内部调用 :cpp:func:`esp_bt_controller_enable()` |
| 62 | + :SOC_BT_SUPPORTED: - 蓝牙 (Bluedroid): :cpp:func:`esp_bt_controller_enable()` |
| 63 | + :SOC_IEEE802154_SUPPORTED: - Thread/Zigbee: :cpp:func:`esp_openthread_init` |
| 64 | + |
23 | 65 | 启动 |
24 | 66 | ------- |
25 | 67 |
|
26 | 68 | 在启动过程中,ESP-IDF 引导加载程序暂时会启用一个非 RF 内部熵源(SAR ADC 使用内部参考电压噪声),为首次生成的启动密钥提供熵。 |
27 | 69 |
|
28 | 70 | .. only:: not SOC_WIFI_SUPPORTED and not SOC_IEEE802154_SUPPORTED and not SOC_BT_SUPPORTED |
29 | 71 |
|
30 | | - 但是,当应用程序开始执行后,一直到内部熵源再次被启用前,通常只有伪随机数可用。 |
| 72 | + 对于 {IDF_TARGET_NAME},高速 ADC 不可用。因此,在应用启动时,非 RF 内部熵源 (SAR ADC) 默认保持启用状态。 |
31 | 73 |
|
32 | 74 | .. only:: SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED |
33 | 75 |
|
34 | 76 | 但是,当应用程序开始执行后,一直到 {IDF_TARGET_RF_NAME} 初始化完成前或内部熵源再次被启用前,通常只有伪随机数可用。 |
35 | 77 |
|
| 78 | + 如需在应用程序启动期间临时重启熵源,或为不使用 {IDF_TARGET_RF_NAME} 的应用程序临时重启熵源,请调用函数 :cpp:func:`bootloader_random_enable` 重启内部熵源。在使用下列任一功能前,必须调用函数 :cpp:func:`bootloader_random_disable` 以禁用熵源。 |
36 | 79 |
|
37 | | -如需在应用程序启动期间临时重启熵源,或为不使用 {IDF_TARGET_RF_NAME} 的应用程序临时重启熵源,请调用函数 :cpp:func:`bootloader_random_enable` 重启内部熵源。在使用下列任一功能前,必须调用函数 :cpp:func:`bootloader_random_disable` 以禁用熵源。 |
38 | | - |
39 | | -.. list:: |
| 80 | + .. list:: |
40 | 81 |
|
41 | | - - ADC |
42 | | - |
43 | | - :esp32: - I2S |
44 | | - |
45 | | - :SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED: - {IDF_TARGET_RF_NAME} |
| 82 | + - ADC |
| 83 | + :esp32: - I2S |
| 84 | + :SOC_WIFI_SUPPORTED or SOC_IEEE802154_SUPPORTED or SOC_BT_SUPPORTED: - {IDF_TARGET_RF_NAME} |
46 | 85 |
|
47 | 86 | .. note:: |
48 | 87 |
|
|
54 | 93 |
|
55 | 94 | .. only:: not esp32 |
56 | 95 |
|
| 96 | + .. _secondary entropy: |
| 97 | + |
57 | 98 | 二级熵源 |
58 | 99 | ----------------- |
59 | 100 |
|
|
0 commit comments