当前位置: 首页 > news >正文

AVB(Android Verified Boot)中vbmeta结构浅析

一、AVB介绍

  Android Verified Boot(AVB) 是 Android 系统中用于确保设备启动过程完整性和真实性的安全机制,属于安全启动的一环。它的核心目标是:在设备启动过程中,验证每一个关键组件(如 boot、system、vendor 等)是否被篡改或损坏,从而防止恶意代码执行,保障系统安全。当前AVB不仅仅在Android系统中使用,还普遍在嵌入式linux设备中使用。
AVB的核心实现需要通过vbmeta进行实现,当启用AVB后,会对需要校验的分区进行处理以生成vbmeta镜像和可能向分区插入AVB Footer。本文主要初步介绍vbmeta结构。

二、vbmeta结构

请添加图片描述
在这里插入图片描述
在这里插入图片描述

  vbmeta结构总体分为三部分:Header、Authentication Data、Auxiliary Data。

    1. Header:vbmeta基础信息,包含authentication data和auxiliary data中相关字段的偏移位置和大小、校验vbmeta所需的版本号、防回滚号、avbtool释放信息等
    1. Authentication Data:认证信息,包含对auxiliary data和header的hash值和签名,用于检测vbmeta文件的合法性
    1. Auxiliary Data:辅助信息,包含分区的descriptor信息、公钥信息、公钥元数据等。此处存储用于对后续分区校验的基础信息,例如boot、system等

2.1 Header

  Header包含基础信息,结构体定义在liavb中的avb_vbmeta_image.h中,如下:

typedef struct AvbVBMetaImageHeader {/*   0: Four bytes equal to "AVB0" (AVB_MAGIC). */uint8_t magic[AVB_MAGIC_LEN];/*   4: The major version of libavb required for this header. */uint32_t required_libavb_version_major;/*   8: The minor version of libavb required for this header. */uint32_t required_libavb_version_minor;/*  12: The size of the signature block. */uint64_t authentication_data_block_size;/*  20: The size of the auxiliary data block. */uint64_t auxiliary_data_block_size;/*  28: The verification algorithm used, see |AvbAlgorithmType| enum. */uint32_t algorithm_type;/*  32: Offset into the "Authentication data" block of hash data. */uint64_t hash_offset;/*  40: Length of the hash data. */uint64_t hash_size;/*  48: Offset into the "Authentication data" block of signature data. */uint64_t signature_offset;/*  56: Length of the signature data. */uint64_t signature_size;/*  64: Offset into the "Auxiliary data" block of public key data. */uint64_t public_key_offset;/*  72: Length of the public key data. */uint64_t public_key_size;/*  80: Offset into the "Auxiliary data" block of public key metadata. */uint64_t public_key_metadata_offset;/*  88: Length of the public key metadata. Must be set to zero if there*  is no public key metadata.*/uint64_t public_key_metadata_size;/*  96: Offset into the "Auxiliary data" block of descriptor data. */uint64_t descriptors_offset;/* 104: Length of descriptor data. */uint64_t descriptors_size;/* 112: The rollback index which can be used to prevent rollback to*  older versions.*/uint64_t rollback_index;/* 120: Flags from the AvbVBMetaImageFlags enumeration. This must be* set to zero if the vbmeta image is not a top-level image.*/uint32_t flags;/* 124: The location of the rollback index defined in this header.* Only valid for the main vbmeta. For chained partitions, the rollback* index location must be specified in the AvbChainPartitionDescriptor* and this value must be set to 0.*/uint32_t rollback_index_location;/* 128: The release string from avbtool, e.g. "avbtool 1.0.0" or* "avbtool 1.0.0 xyz_board Git-234abde89". Is guaranteed to be NUL* terminated. Applications must not make assumptions about how this* string is formatted.*/uint8_t release_string[AVB_RELEASE_STRING_SIZE];/* 176: Padding to ensure struct is size AVB_VBMETA_IMAGE_HEADER_SIZE* bytes. This must be set to zeroes.*/uint8_t reserved[80];
} AVB_ATTR_PACKED AvbVBMetaImageHeader;

详细字段说明如下:

    1. magic:4字节,标识符,默认值为“AVB0”
    1. required_libavb_version_major:4字节,解析vbmeta需通过libavb,此字段表明解析此vbmeta文件所需的libavb的最低主版本号。若使用的libavb主版本号低于此字段,则可能导致解析异常
    1. required_libavb_version_minor:4字节,解析vbmeta需通过libavb,此字段表明解析此vbmeta文件所需的libavb的最低次版本号。若使用的libavb主版本号满足,但次版本号低于此字段,也可能导致解析异常
    1. authentication_data_block_size:8字节,authentication data区域的大小(单位:字节)
    1. auxiliary_data_block_size:8字节,auxiliary data区域的大小(单位:字节)
    1. algorithm_type:4字节,校验算法,指明authentication data区域所使用的的hash和签名算法,定义如下
typedef enum {AVB_ALGORITHM_TYPE_NONE,AVB_ALGORITHM_TYPE_SHA256_RSA2048,AVB_ALGORITHM_TYPE_SHA256_RSA4096,AVB_ALGORITHM_TYPE_SHA256_RSA8192,AVB_ALGORITHM_TYPE_SHA512_RSA2048,AVB_ALGORITHM_TYPE_SHA512_RSA4096,AVB_ALGORITHM_TYPE_SHA512_RSA8192,_AVB_ALGORITHM_NUM_TYPES
} AvbAlgorithmType;
    1. hash_offset:8字节,指明authentication data中hash的位置,此字段值表明authentication data里hash字段开始位置相对于authentication data起点的偏移量(单位:字节)
    1. hash_size:8字节,指明authentication data中hash字段的长度(单位:字节)
    1. signature_offset:8字节,指明authentication data中signature字段的起始位置,此字段值表明authentication data里signature字段开始位置相对于authentication data起点的偏移量(单位:字节)
    1. signature_size:8字节,指明authentication data中的signature字段的长度(单位:字节)
    1. public_key_offset:8字节,指明auxiliary data中public key字段的起始位置,此字段值表明auxiliary data里public key字段开始位置相对于auxiliary data起点的偏移量(单位:字节)
    1. public_key_size:8字节,指明auxiliary data中public key字段的长度(单位:字节)
    1. public_key_metadata_offset:8字节,指明auxiliary data中public key metadata字段的起始位置,此字段值表明auxiliary data里public key metadata字段开始位置相对于auxiliary data起点的偏移量(单位:字节)
    1. public_key_metadata_size:8字节,指明auxiliary data中public key meta字段的长度(单位:字节)
    1. descriptors_offset:8字节,8字节,指明auxiliary data中descriptor组的起始位置,此字段值表明auxiliary data里 descriptors组开始位置相对于auxiliary data起点的偏移量(单位:字节)
    1. descriptors_size:8字节,指明auxiliary data中descriptor组的长度(单位:字节)
    1. rollback_index:8字节,防回滚版本号,表明当前vbmeta的版本,通过和系统中安全存储的版本号对比,若当前版本低于系统中存储的版本,可拒绝启动,从而保证避免攻击者通过使用低版本来实施降级攻击(通常低版本漏洞更多,高版本漏洞更少)。
    1. flags:4字节,标记位,定义如下。当为AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED时,将禁用hash树镜像校验功能。当为AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED,将禁用所有descriptor的校验功能。非顶层vbmeta时,必须设置为全0x00
typedef enum {AVB_VBMETA_IMAGE_FLAGS_HASHTREE_DISABLED = (1 << 0),AVB_VBMETA_IMAGE_FLAGS_VERIFICATION_DISABLED = (1 << 1)
} AvbVBMetaImageFlags;
    1. rollback_index_location:4字节,回滚索引的存储编号。为实现对不同的分区进行不同的防回滚管理,可以在系统安全存储区存储分区对应的版本号,通过该字段执行当前vbmeta需要查询的版本号。若不使用此字段,则只有1个回滚版本号来标记所有分区,则无法实施分区精准管理(看是否有此需求,若无此需求,则使用1个回滚版本号即可)
    1. release_string:48字节,释放信息,指明avbtool的版本信息等
    1. reserved:80字节,预留字段,使用全0x00填充即可

2.2 Authentication Data

  Authentication Data主要是认证信息,结构如下:

    1. hash:header和auxiliary data两个区域的hash值
      在这里插入图片描述
    • a. HASH算法由header中的algorithm_type指明
    • b. 存储起点位置由header中的hash_offset指明
    • c. 长度由header中的hash_size指定,需注意此长度应和algorithm_type指定的HASH算法匹配
    1. signature:签名值,对header和auxiliary data区域计算出的HASH,使用私钥进行签名,获得签名值
    • a. HASH算法和签名算法由header中的algorithm_type指明
    • b. 存储起点位置由header中的signature_offset指明
    • c. 签名数据长度由header中的signature_size指定,需注意此长度应和algorithm_type指定的算法匹配
    1. padding:填充值,若hash和signature的长度不为64字节的整倍数,需向上补齐到64字节整倍数,此时就由padding补齐,padding值为全0x00。例如当前hash为32字节,signature为512字节,则总长度为544字节,不为64的整倍数,此时padding长度即为32字节,值为全0x00,添加padding后,整个authentication data长度为576字节,即为64字节的整倍数

2.3 Auxiliary Data

  Auxiliary Data主要是公钥信息、分区信息等,结构如下:

    1. descriptors:descriptor组,每个descriptor用于存储待验证分区信息、验证方式、内核参数等数据,通过descriptor,可以实现:明确验证分区、明确验证方法、构建验证信任链、控制内核参数。为实现以上功能,descriptor存在多种类型,例如hash、hashtree、chain parition、kernel cmdline等,每种descriptor具有特定的格式。
    1. public key:验签公钥,用于验签Authentication Data中的signature,验签signature成功后,必须同步验证此public key是否和上一级(例如uboot)或安全存储(例如TEE)的public key一致。
      在这里插入图片描述
    1. public key metadata:验签公钥相关的元数据
    1. padding:填充值,Auxiliary Data需满足64字节对齐,若当前Auxiliary Data不足64字节整倍数,则通过padding进行补齐,padding使用全0x00填充

2.3.1 descriptor

  常用的descriptor有hash descriptor、hashtree、kernel cmdline,相关descriptor的结构如下图

在这里插入图片描述

所有descriptor都包含一个相同的头部结构avb descriptor,结构如下:

typedef struct AvbDescriptor {uint64_t tag;uint64_t num_bytes_following;
} AVB_ATTR_PACKED AvbDescriptor;
    1. tag:8字节,标签,用于指明当前的descriptor的类型,定义如下,例如AVB_DESCRIPTOR_TAG_HASH表明当前descriptor是hash类型
typedef enum {AVB_DESCRIPTOR_TAG_PROPERTY,AVB_DESCRIPTOR_TAG_HASHTREE,AVB_DESCRIPTOR_TAG_HASH,AVB_DESCRIPTOR_TAG_KERNEL_CMDLINE,AVB_DESCRIPTOR_TAG_CHAIN_PARTITION,
} AvbDescriptorTag;
    1. number_bytes_follwing:8字节,该descriptor的后续长度。从该字段后一个字段开始计算长度,到整个descriptor结束。
2.3.1.1 Kernel cmdline Descriptor

  Kernel cmdline Descriptor用于存储Kernel命令,结构如下
在这里插入图片描述

    1. tag:avb descriptor结构,当前值需为AVB_DESCRIPTOR_TAG_KERNEL_CMDLINE,即0x0000000000000003
    1. number_bytes_following: avb descriptor结构,表明从此字段后到descriptor结束的长度,即flag、
      kernel_cmdline_legnth、kernel_cmdline、padding结构长度。
    1. flag:4字节,标签值,定义如下
typedef enum {AVB_KERNEL_CMDLINE_FLAGS_USE_ONLY_IF_HASHTREE_NOT_DISABLED = (1 << 0),AVB_KERNEL_CMDLINE_FLAGS_USE_ONLY_IF_HASHTREE_DISABLED = (1 << 1)
} AvbKernelCmdlineFlags;
    1. kernel_cmdline_length:4字节,指明后续变长数据区域的kernel_cmdline的长度(单位:字节)
    1. kernel_cmdline:N字节,长度由kernel_cmdline_length指定
    1. padding:N字节,填充值,若kernel cmdline descriptor长度不为8字节整倍数时,需通过padding补齐,padding使用0x00填充
2.3.1.2 Hash Descriptor

  Hash Descriptor用于存储Hash校验信息,结构如下
在这里插入图片描述

    1. tag:avb descriptor结构,当前值需为AVB_DESCRIPTOR_TAG_HASH,即0x0000000000000002
    1. number_bytes_following: avb descriptor结构,表明从此字段后到descriptor结束的长度,即上图中image_size(包含)到padding结束的结构长度。
    1. image_size:8字节,指明该descriptor描述的分区镜像的大小(字节)
    1. hash_algorithm:32字节,指明HASH算法
    1. parition_name_len:4字节,指明变长数据区的parition_name的长度
    1. salt_len:4字节,指明变长数据区的salt长度
    1. digest_len:4字节,指明变长数据区的digest数据长度
    1. flag:4字节,标记位,定义如下
typedef enum {AVB_HASH_DESCRIPTOR_FLAGS_DO_NOT_USE_AB = (1 << 0),
} AvbHashDescriptorFlags;
    1. reserved:60字节,预留字段,使用全0x00填充即可
    1. parition_name:长度由parition_name_len值指定,该值为该descriptor描述的分区名称
    1. salt:长度由salt_len值指定,该值为参与HASH计算的salt
    1. digest:长度由digest_len值指定,该值为该descriptor描述的分区的HASH值
    1. padding:N字节,填充值,若descriptor长度不为8字节整倍数时,需通过padding补齐,padding使用0x00填充
2.3.1.3 Hashtree Descriptor

  Hash Descriptor用于存储HashTree校验信息,结构如下
在这里插入图片描述

    1. tag:avb descriptor结构,当前值需为AVB_DESCRIPTOR_TAG_HASHTREE,即0x0000000000000001
    1. number_bytes_following: avb descriptor结构,表明从此字段后到descriptor结束的长度,即上图中dm-verity-version(包含)到padding结束的结构长度。
    1. dm-verity-version:4字节,使用的dm-verity版本
    1. image_size:8字节,指明该descriptor描述的分区镜像的大小(字节)
    1. tree_offset:8字节,指明hashtree的在待校验分区的偏移
    1. tree_size:8字节,指明hashtree的大小
    1. data_block_size:4字节,指明用于计算HASH树的原始镜像数据块的大小,即多大的数据段计算1个HASH
    1. hash_block_size:4字节,指明HASH树中,计算中间层HASH的大小,即多大的HASH块计算1个更上层的HASH
    1. fec_num_roots:4字节,前向纠错校验根数量,前向纠错功能是个可选功能。生成fec数据后,当hash树损坏时,可尝试通过fec数据修复损坏区。
    1. fec_offset:8字节,前向纠错功能的数据偏移位置
    1. fec_size:8字节,前向纠错功能数据的大小
    1. hash_algorithm:32字节,指明HASH算法
    1. parition_name_len:4字节,指明变长数据区的parition_name的长度
    1. salt_len:4字节,指明变长数据区的salt长度
    1. root_digest_len:4字节,指明变长数据区的root_digest长度
    1. flag:4字节,定义如下
typedef enum {AVB_HASHTREE_DESCRIPTOR_FLAGS_DO_NOT_USE_AB = (1 << 0),AVB_HASHTREE_DESCRIPTOR_FLAGS_CHECK_AT_MOST_ONCE = (1 << 1),
} AvbHashtreeDescriptorFlags;
    1. reserved:60字节
    1. parition_name:长度由parition_name_len值指定,该值为该descriptor描述的分区名称
    1. salt:长度由salt_len值指定,该值为参与HASH计算的salt
    1. root_digest:长度由root_digest_len值指定,该值为该descriptor描述的分区的root hash值
    1. padding:N字节,填充值,若descriptor长度不为8字节整倍数时,需通过padding补齐,padding使用0x00填充
2.3.1.4 Property Descriptor

  Hash Descriptor用于存储属性信息,结构如下
在这里插入图片描述

    1. tag:avb descriptor结构,当前值需为AVB_DESCRIPTOR_TAG_PROPERTY,即0x0000000000000000
    1. number_bytes_following: avb descriptor结构,表明从此字段后到descriptor结束的长度,即上图中key_num_bytes(包含)到padding结束的结构长度。
    1. key_num_bytes:8字节,指明变长数据区key的长度(字节)
    1. value_num_bytes:8字节,指明变长数据区value的长度(字节)
    1. key:N个字节,长度由key_num_bytes指定,存储key名称
    1. value:N个字节,长度由value_num_bytes指定,存储key对应的值
    1. padding:N字节,填充值,若descriptor长度不为8字节整倍数时,需通过padding补齐,padding使用0x00填充
2.3.1.5 Chain Partition Descriptor

  Hash Descriptor用于存储链式分区信息,用于进行跨分区信任链传输,结构如下
在这里插入图片描述

    1. tag:avb descriptor结构,当前值需为AVB_DESCRIPTOR_TAG_PROPERTY,即0x0000000000000004
    1. number_bytes_following: avb descriptor结构,表明从此字段后到descriptor结束的长度,即上图中rollback_index_location(包含)到padding结束的结构长度。
    1. rollback_index_location:4字节,回滚索引(Rollback Index)的位置,用于防降级攻击
    1. parition_name_len:4字节,分区名称长度,指明变长数据parition_name的长度
    1. public_key_len:4字节,公钥长度,指明变长数据区public key的长度
    1. flag:4字节,定义如下
typedef enum {AVB_CHAIN_PARTITION_DESCRIPTOR_FLAGS_DO_NOT_USE_AB = (1 << 0),
} AvbChainPartitionDescriptorFlags;
    1. reserved:60字节,预留字段,使用全0x00填充
    1. parition_name:下一个vbmeta结构镜像名称,长度由parition_name_len指定
    1. public_key:公钥,长度由public_key_len指定,用于校验下一级分区vbmeta的公钥,即parition_name中vbmeta的signature,需保证下一级vbmeta的auxiliary data中public key和此处一致。
    1. padding:N字节,填充值,若descriptor长度不为8字节整倍数时,需通过padding补齐,padding使用0x00填充

三、AVB Footer

  启用AVB校验后,分区的校验信息可以保存在1个单独的vbmeta.img中(以descriptor形式),也可以将vbmeta信息插入待校验分区中,并同步在分区尾部插入avb footer信息。avb footer用于指引avb如何寻找嵌入在分区中的vbmeta信息,因此avb footer必须在分区的最尾部。avb footer结构如下

在这里插入图片描述

    1. magic:4字节,填充默认值“AVBf”,用于指明当前为avb footer结构
    1. version_major:4字节,当前AVB Footer结构的主版本号
    1. version_minor:4字节,当前AVB Footer结构的次版本号
    1. original_image_size:8字节,添加AVB校验前分区原始镜像的大小(单位:字节)
    1. vbmeta_offset:8字节,该分区的vbmeta数据位置,即从分区头部开始到vbmeta起始的偏移量
    1. vbmeta_size:8字节,该分区的vbmeta结构大小(单位:字节)
    1. reserved:28字节,预留字段,使用全0x00填充

四、 示例

  网上下载1份手机ROM,找到vbmeata.img镜像包并打开,按照第三章节的结构,分为三个部分:Header、Authentication Data、Auxiliary Data。

4.1 Header

  首先最上部的就是Header区域,长度固定为256个字节,含义如下
在这里插入图片描述

    1. magic:41 56 42 30,对应ASCII的“AVB0”
    1. required_libavb_version_major:00 00 00 01,表明所需的liavb最小主版本号为1
    1. required_libavb_version_minor:00 00 00 00,表明所需的liavb最小次版本号为0
    1. authentication_data_block_size:00 00 00 00 00 00 01 40,表明authentication data的长度为0x140,即320字节。因Header是固定的256字节,则表明authentication data区域从offset的0100开始到023F区域
      在这里插入图片描述
  • 5.auxiliary_data_block_size:00 00 00 00 00 00 18 80,表明auxiliary data长度为0x1880,即6272字节。通过authentication_data_block_size可知,auxiliary data的起始offset为0240,此字段说明长度为1880,则结束offset为1ABF

    1. algorithm_type:00 00 00 01,即AVB_ALGORITHM_TYPE_SHA256_RSA2048,使用的算法为SHA256+RSA2048
    1. hash_offset:00 00 00 00 00 00 00 00,表明authentication data中,hash字段相当于authentication data起点的偏移为0,即authentication data的开始即为hash字段的值。
    1. hash_size: 00 00 00 00 00 00 00 20,表明authentication data中hash字段的长度为0x20,即32个字节,符合algorithm_type指明的SHA256算法。结合hash_offset即可知晓authentication data开始的前32个字节为HASH值
      在这里插入图片描述
    1. signature_offset: 00 00 00 00 00 00 00 20,表明authentication data中signature字段的开始位置为authentication data开始后的0x20位置
    1. signature_size:00 00 00 00 00 00 01 00,表明authentication data中signature字段的大小为0x100,即256字节,符合RSA2048签名长度。结合signature_offset,signature字段值如下
      在这里插入图片描述

鉴于hash_size+signature_size值为0x120(十进制:288)字节,不为64的整倍数,因此authentication data中padding需保证整个authentication data长度为64整倍数,即长度向上取到320字节,此时padding长度为320-288=32字节,即offset 220到23F区域为padding。则从offset 0240开始即为auxiliary data数据

    1. public_key_offset:00 00 00 00 00 00 16 68,表明auxiliary data中public key字段的起点相对于auxiliary data起点的偏移量
    1. public_key_size:00 00 00 00 00 00 02 08,表明auxiliary data中public key数据的长度为0x208,即520字节。集合public_key_offset信息,public key数据的位置区为从offset的0x0240+0x1668=0x18A8开始,结束于offset 1AAF。
      在这里插入图片描述
    1. public_key_metadata_offset:00 00 00 00 00 00 18 70,表明auxiliary data中public key的元数据位置为auxiliary data起点开始偏移量为0x1870处,即240+1870=1AB0开始
    1. public_key_metadata_size:00 00 00 00 00 00 00 00,表明auxiliary data中public key的元数据长度为0,即不存在public key元数据
    1. descriptor_offset:00 00 00 00 00 00 00 00,表明auxiliary data的起点开始就是descriptor数据,即offset为0x240
    1. descriptor_size:00 00 00 00 00 00 16 68,表明descriptor数据的长度为0x1668,结合descriptor_offset,则descriptor数据区为offset的0240到18A7
    1. rollback_index:00 00 00 00 00 00 00 00,表明防回滚版本号为0(无值)
    1. flag:00 00 00 00,表明flag为0
    1. rollback_index_location:00 00 00 00,表明索引为0(无特殊要求)
    1. release_string:值为“avbtool 1.3.0”,表明avbtool的版本号
      在这里插入图片描述
    1. reserved:80字节的全0x00值,预留字段。

4.2 Authentication Data

  第二部分为Authentication Data,通过Header可以知晓,Authentication Data地址区为offset的0100到023F,长度为320字节,结构如下:
在这里插入图片描述

    1. hash:起始位置由Header中的hash_offset指定(即0x00),长度由Header中的hash_size指定(即0x20),本文件hash的起始位置为offset 0100开始,结束位置为offset 011F,值为F5 49 FB EB 53 4A 96 CC 23 66 A3 53 54 5F A1 E9 DB DC 66 12 01 A3 AA 67 43 34 C0 65 22 02 08 59。
    1. signature:起始位置由Header中的signature_offset指定(即0x20),长度由Header中的signature_size指定(即0x100),本文件signature的起始位置为offset 0120,结束位置为offset 021F。
      在这里插入图片描述
    1. padding:起始位置紧跟signature尾部,长度计算方法
    • a. 生成vbmeta时:整个Authentication Data长度需为64字节的整倍数,当前hash+signature长度为0x20+0x100=0x120(即288字节),向64字节取整后,Authentication Data长度应为320字节,则padding长度应为320-288=32字节。
    • b. 验证vbmeta时:通过Header头部authentication_data_block_size找到整个authentication data长度,再使用authentication_data_block_size - hash_size - signature_size = pading_size。
      在这里插入图片描述

4.3 Auxiliary Data

  第三部分为Auxiliary Data,通过Header可以知晓,Auxiliary Data地址区为offset的0240到1ABF,长度为1880字节,结构如下:
在这里插入图片描述

    1. descriptor组:通过Header中的descriptor_offset和descriptor_size可以知晓Auxiliary Data从偏移0开始就是descriptor,长度共0x1668(即5736字节)。因descriptor数量较多,故选择第1个descriptor进行解析,其他按相同方法解析即可。所有类型的descriptor的前16个字节都是固定的AVB Descriptor格式
      在这里插入图片描述
    • a. tag:00 00 00 00 00 00 00 04,表明该descriptor类型为AVB_DESCRIPTOR_TAG_CHAIN_PARTITION,是个Chain Partition Descriptor。结构如下
      在这里插入图片描述

    • b. number_bytes_following:00 00 00 00 00 00 02 60,表明从下一个字节开始到本descriptor结束的长度,因此本descriptor数据区为offset 0240到offset 04AF

    • c.rollback_index_location:00 00 00 01,回滚版本号,此版本号需高于存储在系统中的版本号

    • d. parition_name_len:00 00 00 08,表明分区名称长度为8字节

    • e. public_key_len:00 00 02 08,表明公钥的长度为0x208,即520字节

    • f. flag:00 00 00 00,表明flag无意义

    • h. reserved:预留字段,60字节,值为全0x00
      在这里插入图片描述

    • i. parition_name:表明当前chain parition descriptor描述的分区名称,即“recovery”
      在这里插入图片描述

    • j. public_key:表明用于recovery分区vbmeta的校验公钥值,长度由public_key_len定义,即为0x208,起始位置为offset 02A4,结束位置为offset 04AB
      在这里插入图片描述

    • k. padding:当前descriptor需要保持8字节对齐,因此需要4个字节的pading填充,padding值为0x00

    1. public key:通过Header中的public_key_offset和public_key_size可以知晓public key数据区为offset 18A8到offset 1AAF,长度为0x208(即520字节),使用此public key校验Authentication Data中的signature,且必须验证此public key和上一级存储的公钥是否一致,例如uboot中存储的公钥
      在这里插入图片描述
    1. public key metadata:通过Header中的public_key_metadata_offset和public_key_metadata_size可知,当前文件不存在public key metadata。
http://www.lryc.cn/news/625126.html

相关文章:

  • C/C++ 中 str、str、*str 在指针语境下的具体含义(以 char* str 为例):
  • Android输入框文字不垂直居中
  • Linux下的软件编程——IPC机制
  • Java发送企业微信通知
  • Vue2篇——第五章 Vue.js 自定义指令与插槽核心
  • (第十八期)图像标签的三个常用属性:width、height、border
  • minio安装和配置
  • 【DL学习笔记】交叉熵损失函数详解
  • 之前说的要写的TCP高性能服务器,今天来了
  • 给linux的root磁盘扩容
  • Ansible 部署LNMP
  • 每日AI要闻【20250818】
  • 自回归图像生成新突破!140亿参数自回归模型NextStep-1开源,图像生成无需扩散模型
  • 基于SFM的三维重建MATLAB程序
  • MBTI职业规划指南:发掘你的人格潜能,照亮职业发展之路
  • Elasticsearch查询中的track_total_hits参数
  • 力扣hot100:移动零问题的巧妙解决:双指针与原地交换策略(283)
  • 构建高效智能语音代理:技术架构、实现细节与API服务推荐
  • shell脚本第一阶段
  • Linux命令大全-rm命令
  • 音频算法工程师技能1
  • Docker常见指令速查
  • mq存量消息如何处理
  • 电商API接口实录对接:1688混批价格函数处理
  • python DataFrame基础操作
  • 烟草行政处罚案卷制作与评查平台被中国信通院认定为2025年商业产品及企业典型案例
  • 第一阶段C#基础-13:索引器,接口,泛型
  • AI出题人给出的Java后端面经(十八)(日更)
  • 什么是系统设计
  • 电竞酒店和高校宿舍对AI云电竞游戏盒子的需求有什么不同?