可信启动与fTPM的交互验证(概念验证)

安全之安全(security²)博客目录导读

目录

一、组件构成

二、Arm FVP平台PoC构建

三、在Armv8-A Foundation FVP上运行PoC

四、微调fTPM TA


可信启动(Measured Boot)是通过密码学方式度量启动阶段代码及关键数据(例如使用TPM芯片)的过程,以便后续对系统安全状态进行验证。

当前TF-A集成的驱动支持多种后端存储方式,每种方式采用不同的测量值存储机制。本节重点讨论TCG事件日志后端,该后端将测量值存储在安全内存中。

详见可信启动设计文档。

该驱动还提供将事件日志传递至普通世界的机制。

本手册提供的概念验证(PoC)构建指南,旨在演示如何将可信启动与基于OP-TEE实现的fTPM(fTPM)服务结合使用。

【注意】本文档的构建指南仅用于展示TF-A可信启动如何与第三方(f)TPM服务交互,内容尽可能保持通用性。不同平台可能存在不同需求和配置(例如采用不同SHA算法),也可能使用不同类型的TPM服务(甚至其他类型的证明服务),因此部分指南可能不适用于特定场景。

一、组件构成

该PoC基于OP-TEE工具链构建(自提交cf56848起支持在Foundation模型上运行带可信启动功能的TF-A)。该工具链生成的镜像集包含验证事件日志正确性所需的所有组件,其中一个镜像将集成第三方fTPM服务用于处理事件日志。

选择OP-TEE工具链构建PoC主要出于便利性考虑。由于fTPM服务是OP-TEE可信应用(TA),可轻松将其编译支持添加到工具链中。

与可信启动/fTPM功能密切相关的核心组件包括:

  • OP-TEE:本PoC使用的fTPM服务作为OP-TEE TA运行,因此需包含OP-TEE OS镜像。OP-TEE 3.9.0版本通过实现PTA_SYSTEM_GET_TPM_EVENT_LOG系统调用,支持从TF-A获取事件日志副本。OP-TEE通过解析TF-A传递的DTB绑定信息定位事件日志(详见事件日志DTB绑定属性说明)。

  • fTPM服务:采用微软ms-tpm-20-ref参考实现中的Aarch32架构示例,该服务已扩展支持在启动时处理可信启动事件日志,并通过上述系统调用获取日志副本。

【注意】Arm不提供fTPM实现。本PoC使用的第三方fTPM服务经修改支持TF-A可信启动,其输出正确性验证超出本手册范围。

  • TPM内核模块:用于将用户空间请求转发至安全世界。

  • tpm2-tools工具集:用于读取fTPM服务中的PCR测量值。

二、Arm FVP平台PoC构建

如前所述,此PoC基于OP-TEE工具包,具有一些扩展以启用Measured Boot和fTPM服务。因此,我们可以依靠这些指令来构建原始的OP-TEE工具包。一般来说,以下步骤就足够了:

  1. 首先,按照获取和构建解决方案的指导来构建OP-TEE工具包。在步骤3中,您需要从主分支获取FVP平台的manifest:

    $ repo init -u https://github.com/OP-TEE/manifest.git -m fvp.xml
  2. 接下来,您应该获得Armv8-A Foundation Platform (For Linux Hosts Only)。二进制文件应该解压缩到repo树的根目录,即像这样:<fvp-project>/Foundation_Platformpkg。最后,在克隆所有源代码,获得工具链并“安装”Foundation_Platformpkg之后,你应该有一个看起来像这样的文件夹结构:

$ ls -la
total 80
drwxrwxr-x 20 tf-a_user tf-a_user 4096 Jul  1 12:16 .
drwxr-xr-x 23 tf-a_user tf-a_user 4096 Jul  1 10:40 ..
drwxrwxr-x 12 tf-a_user tf-a_user 4096 Jul  1 10:45 build
drwxrwxr-x 16 tf-a_user tf-a_user 4096 Jul  1 12:16 buildroot
drwxrwxr-x 51 tf-a_user tf-a_user 4096 Jul  1 10:45 edk2
drwxrwxr-x  6 tf-a_user tf-a_user 4096 Jul  1 12:14 edk2-platforms
drwxr-xr-x  7 tf-a_user tf-a_user 4096 Jul  1 10:52 Foundation_Platformpkg
drwxrwxr-x 17 tf-a_user tf-a_user 4096 Jul  2 10:40 grub
drwxrwxr-x 25 tf-a_user tf-a_user 4096 Jul  2 10:39 linux
drwxrwxr-x 15 tf-a_user tf-a_user 4096 Jul  1 10:45 mbedtls
drwxrwxr-x  6 tf-a_user tf-a_user 4096 Jul  1 10:45 ms-tpm-20-ref
drwxrwxr-x  8 tf-a_user tf-a_user 4096 Jul  1 10:45 optee_client
drwxrwxr-x 10 tf-a_user tf-a_user 4096 Jul  1 10:45 optee_examples
drwxrwxr-x 12 tf-a_user tf-a_user 4096 Jul  1 12:13 optee_os
drwxrwxr-x  8 tf-a_user tf-a_user 4096 Jul  1 10:45 optee_test
drwxrwxr-x  7 tf-a_user tf-a_user 4096 Jul  1 10:45 .repo
drwxrwxr-x  4 tf-a_user tf-a_user 4096 Jul  1 12:12 toolchains
drwxrwxr-x 21 tf-a_user tf-a_user 4096 Jul  1 12:15 trusted-firmware-a

      3. 现在进入ms-tpm-20-ref并获取其依赖项:

$ cd ms-tpm-20-ref
$ git submodule init
$ git submodule update
Submodule path 'external/wolfssl': checked out '9c87f979a7f1d3a6d786b260653d566c1d31a1c4'

      4.现在,您应该能够继续执行“获取并构建解决方案(Get and build the solution)”说明中的第5步。为了启用对Measured Boot的支持,您需要设置以下构建选项:

$ MEASURED_BOOT=y MEASURED_BOOT_FTPM=y make -j `nproc`

【注意】:构建过程可能需要很长时间。强烈建议传递-j选项以使进程运行得更快。

在这一步之后,您应该已经准备好运行镜像了。

三、在Armv8-A Foundation FVP上运行PoC

构建好所有内容后,现在可以运行镜像:

$ make run-only

【注意】:使用make run将构建并运行镜像,可以使用它来代替简单的make。但是,一旦构建了镜像,建议使用make run-only来避免重新运行所有构建规则,这将花费时间。

当启动FVP(固定虚拟平台)时,会出现两个终端窗口。FVP terminal_0是用户空间终端,而FVP terminal_1是安全世界(Secure World)的对应终端(例如可信应用TAs的日志将在此处输出)。

使用root用户登录系统镜像shell(无需密码),随后可执行ftpm命令。该命令是一个组合别名,其功能包括:

  1. 加载ftpm内核模块

  2. 调用tpm2_pcrread访问fTPM服务以读取PCR值

当加载ftpm内核模块时,fTPM可信应用(TA)会被载入安全世界。该TA随后会请求获取引导过程中生成的事件日志(Event Log)副本,从而首先检索并记录日志中的所有条目。

【注意】对于这个PoC,在BL33和NT_FW_CONFIG之后加载的任何内容都不会记录在事件日志中。

安全世界终端应该显示fTPM服务的调试日志,包括正在处理的事件日志中可用的所有测量:

M/TA: Preparing to extend the following TPM Event Log:
M/TA: TCG_EfiSpecIDEvent:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 3
M/TA:   Digest             : 00
M/TA:                      : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
M/TA:                      : 00 00 00
M/TA:   EventSize          : 33
M/TA:   Signature          : Spec ID Event03
M/TA:   PlatformClass      : 0
M/TA:   SpecVersion        : 2.0.2
M/TA:   UintnSize          : 1
M/TA:   NumberOfAlgorithms : 1
M/TA:   DigestSizes        :
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        DigestSize    : 32
M/TA:   VendorInfoSize     : 0
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 3
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
M/TA:                      : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
M/TA:   EventSize          : 17
M/TA:   Signature          : StartupLocality
M/TA:   StartupLocality    : 0
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 58 26 32 6e 64 45 64 da 45 de 35 db 96 fd ed 63
M/TA:                      : 2a 6a d4 0d aa 94 b0 b1 55 e4 72 e7 1f 0a e0 d5
M/TA:   EventSize          : 5
M/TA:   Event              : BL_2
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : cf f9 7d a3 5c 73 ac cb 7b a0 25 80 6a 6e 50 a5
M/TA:                      : 6b 2e d2 8c c9 36 92 7d 46 c5 b9 c3 a4 6c 51 7c
M/TA:   EventSize          : 6
M/TA:   Event              : BL_31
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 23 b0 a3 5d 54 d9 43 1a 5c b9 89 63 1c da 06 c2
M/TA:                      : e5 de e7 7e 99 17 52 12 7d f7 45 ca 4f 4a 39 c0
M/TA:   EventSize          : 10
M/TA:   Event              : HW_CONFIG
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 4e e4 8e 5a e6 50 ed e0 b5 a3 54 8a 1f d6 0e 8a
M/TA:                      : ea 0e 71 75 0e a4 3f 82 76 ce af cd 7c b0 91 e0
M/TA:   EventSize          : 14
M/TA:   Event              : SOC_FW_CONFIG
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 01 b0 80 47 a1 ce 86 cd df 89 d2 1f 2e fc 6c 22
M/TA:                      : f8 19 ec 6e 1e ec 73 ba 5a be d0 96 e3 5f 6d 75
M/TA:   EventSize          : 6
M/TA:   Event              : BL_32
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 5d c6 ef 35 5a 90 81 b4 37 e6 3b 52 da 92 ab 8e
M/TA:                      : d9 6e 93 98 2d 40 87 96 1b 5a a7 ee f1 f4 40 63
M/TA:   EventSize          : 18
M/TA:   Event              : BL32_EXTRA1_IMAGE
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 39 b7 13 b9 93 db 32 2f 1b 48 30 eb 2c f2 5c 25
M/TA:                      : 00 0f 38 dc 8e c8 02 cd 79 f2 48 d2 2c 25 ab e2
M/TA:   EventSize          : 6
M/TA:   Event              : BL_33
M/TA: PCR_Event2:
M/TA:   PCRIndex           : 0
M/TA:   EventType          : 1
M/TA:   Digests Count      : 1
M/TA:     #0 AlgorithmId   : SHA256
M/TA:        Digest        : 25 10 60 5d d4 bc 9d 82 7a 16 9f 8a cc 47 95 a6
M/TA:                      : fd ca a0 c1 2b c9 99 8f 51 20 ff c6 ed 74 68 5a
M/TA:   EventSize          : 13
M/TA:   Event              : NT_FW_CONFIG

这些日志对应于TF-A在测量的引导过程中存储的测量值,因此,它们应该与TF-A在启动过程中转储的日志相匹配。这些可以在terminal_0上看到:

NOTICE:  Booting Trusted Firmware
NOTICE:  BL1: v2.5(release):v2.5
NOTICE:  BL1: Built : 10:41:20, Jul  2 2021
NOTICE:  BL1: Booting BL2
NOTICE:  BL2: v2.5(release):v2.5
NOTICE:  BL2: Built : 10:41:20, Jul  2 2021
NOTICE:  TCG_EfiSpecIDEvent:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 3
NOTICE:    Digest             : 00
NOTICE:                       : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
NOTICE:                       : 00 00 00
NOTICE:    EventSize          : 33
NOTICE:    Signature          : Spec ID Event03
NOTICE:    PlatformClass      : 0
NOTICE:    SpecVersion        : 2.0.2
NOTICE:    UintnSize          : 1
NOTICE:    NumberOfAlgorithms : 1
NOTICE:    DigestSizes        :
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         DigestSize    : 32
NOTICE:    VendorInfoSize     : 0
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 3
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
NOTICE:                       : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
NOTICE:    EventSize          : 17
NOTICE:    Signature          : StartupLocality
NOTICE:    StartupLocality    : 0
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 58 26 32 6e 64 45 64 da 45 de 35 db 96 fd ed 63
NOTICE:                       : 2a 6a d4 0d aa 94 b0 b1 55 e4 72 e7 1f 0a e0 d5
NOTICE:    EventSize          : 5
NOTICE:    Event              : BL_2
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : cf f9 7d a3 5c 73 ac cb 7b a0 25 80 6a 6e 50 a5
NOTICE:                       : 6b 2e d2 8c c9 36 92 7d 46 c5 b9 c3 a4 6c 51 7c
NOTICE:    EventSize          : 6
NOTICE:    Event              : BL_31
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 23 b0 a3 5d 54 d9 43 1a 5c b9 89 63 1c da 06 c2
NOTICE:                       : e5 de e7 7e 99 17 52 12 7d f7 45 ca 4f 4a 39 c0
NOTICE:    EventSize          : 10
NOTICE:    Event              : HW_CONFIG
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 4e e4 8e 5a e6 50 ed e0 b5 a3 54 8a 1f d6 0e 8a
NOTICE:                       : ea 0e 71 75 0e a4 3f 82 76 ce af cd 7c b0 91 e0
NOTICE:    EventSize          : 14
NOTICE:    Event              : SOC_FW_CONFIG
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 01 b0 80 47 a1 ce 86 cd df 89 d2 1f 2e fc 6c 22
NOTICE:                       : f8 19 ec 6e 1e ec 73 ba 5a be d0 96 e3 5f 6d 75
NOTICE:    EventSize          : 6
NOTICE:    Event              : BL_32
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 5d c6 ef 35 5a 90 81 b4 37 e6 3b 52 da 92 ab 8e
NOTICE:                       : d9 6e 93 98 2d 40 87 96 1b 5a a7 ee f1 f4 40 63
NOTICE:    EventSize          : 18
NOTICE:    Event              : BL32_EXTRA1_IMAGE
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 39 b7 13 b9 93 db 32 2f 1b 48 30 eb 2c f2 5c 25
NOTICE:                       : 00 0f 38 dc 8e c8 02 cd 79 f2 48 d2 2c 25 ab e2
NOTICE:    EventSize          : 6
NOTICE:    Event              : BL_33
NOTICE:  PCR_Event2:
NOTICE:    PCRIndex           : 0
NOTICE:    EventType          : 1
NOTICE:    Digests Count      : 1
NOTICE:      #0 AlgorithmId   : SHA256
NOTICE:         Digest        : 25 10 60 5d d4 bc 9d 82 7a 16 9f 8a cc 47 95 a6
NOTICE:                       : fd ca a0 c1 2b c9 99 8f 51 20 ff c6 ed 74 68 5a
NOTICE:    EventSize          : 13
NOTICE:    Event              : NT_FW_CONFIG
NOTICE:  BL1: Booting BL31
NOTICE:  BL31: v2.5(release):v2.5
NOTICE:  BL31: Built : 10:41:20, Jul  2 2021

跟踪fTPM启动过程,我们可以看到事件日志中的所有测量都被扩展并记录在适当的PCR中:

M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: TPM2_PCR_EXTEND_COMMAND returned value:
M/TA:   ret_tag = 0x8002, size = 0x00000013, rc = 0x00000000
M/TA: 9 Event logs processed

在加载fTPM TA之后,由fTPM别名发出的对insmod的调用返回,以加载fTPM内核模块,然后通过tpm_pcrread命令读取TPM PCRs。请注意,我们在这里只对SHA256日志感兴趣,因为这是我们在TF-A上用于测量的算法(参见上面日志中的AlgorithmId字段):

sha256:
0 : 0xA6EB3A7417B8CFA9EBA2E7C22AD5A4C03CDB8F3FBDD7667F9C3EF2EA285A8C9F
1 : 0x0000000000000000000000000000000000000000000000000000000000000000
2 : 0x0000000000000000000000000000000000000000000000000000000000000000
3 : 0x0000000000000000000000000000000000000000000000000000000000000000
4 : 0x0000000000000000000000000000000000000000000000000000000000000000
5 : 0x0000000000000000000000000000000000000000000000000000000000000000
6 : 0x0000000000000000000000000000000000000000000000000000000000000000
7 : 0x0000000000000000000000000000000000000000000000000000000000000000
8 : 0x0000000000000000000000000000000000000000000000000000000000000000
9 : 0x0000000000000000000000000000000000000000000000000000000000000000
10: 0x0000000000000000000000000000000000000000000000000000000000000000
11: 0x0000000000000000000000000000000000000000000000000000000000000000
12: 0x0000000000000000000000000000000000000000000000000000000000000000
13: 0x0000000000000000000000000000000000000000000000000000000000000000
14: 0x0000000000000000000000000000000000000000000000000000000000000000
15: 0x0000000000000000000000000000000000000000000000000000000000000000
16: 0x0000000000000000000000000000000000000000000000000000000000000000
17: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
18: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
19: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
20: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
21: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
22: 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
23: 0x0000000000000000000000000000000000000000000000000000000000000000

在这个PoC中,我们只对PCR0感兴趣,它必须是非空的。这是因为引导进程记录了这个PCR中的所有映像(参见上面事件日志中的PCRIndex字段)。此时其余的记录必须为0。

【注意】:使用的fTPM服务只支持16个pcr,因此超过15个pcr的内容可以忽略。

【注意】:如前所述,Arm不提供fTPM实现,因此我们在这里不验证PCR0的内容是否正确。对于这个PoC,我们只关注事件日志可以传递给第三方fTPM,并且它的记录得到了适当的扩展。

四、微调fTPM TA

如前所述,OP-TEE工具包包括对构建第三方fTPM服务的支持。此服务的构建选项是为PoC量身定制的,并在构建环境变量FTPM_FLAGS中定义(请参阅<toolkit_home>/build/common.mk),但如果需要,可以修改它们以更好地适应特定场景。

测量引导支持最相关的选项是:

•CFG_TA_DEBUG:启用Terminal_1控制台的调试日志。

•CFG_TEE_TA_LOG_LEVEL:定义用于调试消息的日志级别。

•CFG_TA_MEASURED_BOOT:启用对fTPM上测量引导的支持。

•CFG_TA_EVENT_LOG_SIZE:定义fTPM能够存储的大事件日志的大小(以字节为单位),因为这个缓冲区是在构建时分配的。这必须至少与TF-A生成的事件日志的大小相同。如果没有定义这个构建选项,那么fTPM就会退回到1024字节的默认值,这对于这个PoC来说已经足够了,所以这个变量没有在FTPM_FLAGS中定义。

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

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

相关文章

SQL Server基础语句4:数据定义

文章目录 一、数据库与架构1.1 创建与删除数据库1.1.1 使用CREATE DATABASE语句创建数据库1.1.2 使用DROP DATABASE语句删除数据库1.1.3 使用SSMS创建数据库1.1.4 使用SSMS删除数据库 1.2 CREATE SCHEMA&#xff1a;创建新架构1.2.1 Schema简介1.2.2 使用CREATE SCHEMA语句创建…

上门按摩app会员系统框架搭建

一、逻辑分析 用户注册与登录&#xff1a; 新用户需要提供基本信息&#xff0c;如姓名、手机号、邮箱等进行注册。手机号用于接收验证码进行身份验证&#xff0c;邮箱可用于密码找回等功能。注册成功后&#xff0c;用户可以使用手机号 / 邮箱和密码进行登录。登录时需要验证用户…

java项目打包成jar包,并给jmeter使用

1.新建项目 编写代码&#xff0c;导入必要的jar包&#xff0c; 右键点击项目&#xff0c;然后export&#xff0c;选择main函数&#xff0c; package utils; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Random; …

【Qt开发】Qt音频

Qt中&#xff0c;视频播放的功能主要是通过 QMediaPlayer类和 QVideoWidget类来实现。在使用这两个类时&#xff0c;需要在 .pro项目配置文件中添加对应的模块——multimedia 和 multimediawidgets。 核心的API如下&#xff1a; 下面来模拟实现音频文件的播放。 Widget::Widget…

椭球面上梯形面积的通用公式和图幅公式

import numpy as np def ellipsoidal_trapezoid_area(a, b, phi1_deg, phi2_deg, delta_L_deg, is_map_sheetFalse): """ 计算椭球面上梯形面积的通用公式和图幅公式 参数: a: 椭球长半轴&#xff08;米&#xff09; b: 椭球…

Pytest 入门:测试函数与测试类详解

概述 在编写自动化测试时,了解如何组织和管理测试用例是至关重要的。Pytest 提供了灵活的方式来定义测试函数和测试类,并支持多层次的设置(setup)和清理(teardown)机制,帮助你更高效地进行代码验证。本文将详细介绍 测试函数 和 测试类 的概念、定义、注意点以及实际操…

大模型的部署简单搭建

大模型的部署搭建 真的好久没有进行博客的写作了,原因,最近的自己生活有点小波动, 最近想想还是有空写一篇文章,这篇文章的描述是学习的当下热门AI 本期,介绍的也是AI相关的LLM(大语言模型) 这个好多人应该都是模糊的,包括我一开始没有学习,就感觉牛逼的不行,今天我们亲自部署实…

基于ssm英语学习交流平台微信小程序源码数据库文档

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了英语学习交流平台小程序的开发全过程。通过分析英语学习交流平台小程序管理的不足&#xff0c;创建了一个计算机管理英语学习交流平台小程序的方案。文章介绍了英…

华为云Flexus+DeepSeek征文|在Dify-LLM平台中开发童话故事精灵工作流AI Agent

华为云FlexusDeepSeek征文&#xff5c;在Dify-LLM平台中开发童话故事精灵工作流AI Agent &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录…

从实践出发谈如何开发一款好用的RTMP播放器

近几年&#xff0c;RTMP 播放器市场涌现出大量“宣传型”产品。各种“低延迟”“不卡顿”“跨平台”几乎成为标配口号&#xff0c;宣传文案看起来精彩纷呈&#xff0c;实际项目落地时却屡屡暴露问题&#xff1a;启动缓慢、黑屏、音画不同步&#xff0c;甚至连基本的稳定播放都无…

STM32F1\F4\H7 CubeMx 定时器配置

目录 1 定时器使用 1.1 CubeMX 配置 1.1.1 创建工程 1.1.2 时钟配置 1.1.3 定时器配置 1.1.4 GPIO 配置 1.1.5 工程管理 1.2 keil5 配置 1.2.1 添加代码 1.2.2 修改配置 1.2.3 下载程序 2 PWM使用 2.1 CubeMX 配置 2.1.1 PWM 配置 2.1.2 周期\频率计算方法 2.2…

2025中科院2区SCI-状态优化算法Status-based Optimization-附Matlab免费代码

近年来&#xff0c;现实世界的优化问题变得越来越复杂&#xff0c;挑战了传统确定性方法的有效性。本文介绍了基于状态的优化&#xff08;SBO&#xff09;&#xff0c;这是一种受人类对地位提升的渴望启发的高效算法。通过模拟个人如何接近、学习或从高地位人物那里获得资源&am…

MySQL 启动报错 “The server quit without updating PID file“ 的全面解决方案(适用于 5.7/8.0 全版本)

摘要 在 MySQL 数据库运维中&#xff0c;"The server quit without updating PID file" 是常见且棘手的启动错误。本文结合 MySQL 官方文档及实战经验&#xff0c;系统梳理该错误的 10 大核心成因与解决方案&#xff0c;覆盖权限、配置、磁盘、SELinux 等多维度&…

运行时安全引擎RSE

安全之安全(security)博客目录导读 目录 一、RSE 通信层 1.1 消息结构 1.2 源代码文件 1.3 MHU 通信的 API 二、RSE 提供的运行时服务 2.1 运行时服务 API 2.2 软件与 API 层次结构 三、基于 RSE 的 Measured Boot&#xff08;度量启动&#xff09; 3.1 Measured Boo…

Elasticsearch、Faiss、Milvus在向量索引实现上的核心差

Faiss、Elasticsearch&#xff08;ES&#xff09;和Milvus在向量索引实现上的核心差异主要体现在架构定位、索引技术、扩展性及适用场景上&#xff0c;具体对比如下&#xff1a; 一、架构设计与定位‌ ‌维度‌‌Faiss‌‌Elasticsearch‌‌Milvus‌‌核心定位‌单机向量索引…

iot-dc3 项目windows本地运行保姆喂奶级教程

一.源码拉取 当前时间:2025年06月18日12点02分 后台接口服务:https://gitee.com/pnoker/iot-dc3.git 前端:https://gitee.com/pnoker/iot-dc3-web.git 请自行拉取至本地。 二.本地环境准备 其他基础环境先不讲了,如有需要请留言。 idea + VS Code。 IntelliJ IDEA 2024.2.…

内部网关协议配置实验

一&#xff1a;静态路由 简述&#xff1a;在华为路由器中&#xff0c;使用ip route-static命令配置静态路由。一条静态路由主要包含以下要素。 目的地址&#xff1a;数据包要到达的目标IP地址 子网掩码&#xff1a;用于指定目的地址的网络部分和主机部分 下一跳地址&#xff08…

大模型应用:如何使用Langchain+Qwen部署一套Rag检索系统

一、TL&#xff1b;DR 从0-1使用qwen chat model langchain的链式架构搭建一套rag系统详细介绍了Langchain的工具链的调用流程简单介绍了可能会出现什么问题 二、方法 参考开源链接&#xff1a;https://github.com/Aphasia0515/self_llm/ 2.1 硬件和软件依赖 类型需求备注…

决策树:化繁为简的智能决策利器

本文来自「大千AI助手」技术实战系列&#xff0c;专注用真话讲技术&#xff0c;拒绝过度包装。 想象一个相亲决策过程&#xff1a; 对方收入 > 30万&#xff1f; → 是 → 见面否 → 颜值高&#xff1f; → 是 → 先聊聊否 → 放弃 这种层层递进的判断结构&#xff0c;正是…

html中的盒子标签div标签,有序列表,无序列表

div标签 div标签对于分析数据很重要&#xff0c;因为数据在页面中展示是以区域的形式展示的&#xff0c;而查找数据需要先找到盒子名称在继续向下找。前端页面布局中有两种布局方式&#xff0c;一种是通过表格布局&#xff0c;一种是通过divcss来布局。 <!DOCTYPE html>…