@@ -69,6 +69,33 @@ struct AvbFooter {
6969 uint8_t reserved[28 ];
7070} __attribute__((packed));
7171
72+ // https://android.googlesource.com/platform/external/avb/+/refs/heads/android11-release/libavb/avb_descriptor.h
73+ enum AvbDescriptorTag : uint64_t {
74+ AVB_DESCRIPTOR_TAG_PROPERTY = 0 ,
75+ AVB_DESCRIPTOR_TAG_HASHTREE = 1 ,
76+ AVB_DESCRIPTOR_TAG_HASH = 2 ,
77+ AVB_DESCRIPTOR_TAG_KERNEL_CMDLINE = 3 ,
78+ AVB_DESCRIPTOR_TAG_CHAIN_PARTITION = 4 ,
79+ };
80+
81+ struct AvbDescriptor {
82+ uint64_t tag;
83+ uint64_t num_bytes; // size of descriptor body (excludes this header)
84+ } __attribute__((packed));
85+
86+ // https://android.googlesource.com/platform/external/avb/+/refs/heads/android11-release/libavb/avb_hash_descriptor.h
87+ struct AvbHashDescriptor {
88+ AvbDescriptor header; // tag == 2
89+ uint64_t image_size;
90+ uint8_t hash_algorithm[32 ];
91+ uint32_t partition_name_len;
92+ uint32_t salt_len;
93+ uint32_t digest_len;
94+ uint32_t flags;
95+ uint8_t reserved[60 ];
96+ // followed by: partition_name, salt, digest (variable length)
97+ } __attribute__((packed));
98+
7299// https://android.googlesource.com/platform/external/avb/+/refs/heads/android11-release/libavb/avb_vbmeta_image.h
73100struct AvbVBMetaImageHeader {
74101 uint8_t magic[AVB_MAGIC_LEN];
@@ -92,8 +119,37 @@ struct AvbVBMetaImageHeader {
92119 uint32_t rollback_index_location;
93120 uint8_t release_string[AVB_RELEASE_STRING_SIZE];
94121 uint8_t reserved[80 ];
122+
123+ struct AvbDescriptorRange descriptors () const ;
95124} __attribute__((packed));
96125
126+ struct AvbDescriptorIterator {
127+ AvbDescriptor *ptr;
128+ AvbDescriptor &operator *() const { return *ptr; }
129+ AvbDescriptor *operator ->() const { return ptr; }
130+ bool operator !=(const AvbDescriptorIterator &o) const { return ptr != o.ptr ; }
131+ AvbDescriptorIterator &operator ++() {
132+ ptr = reinterpret_cast <AvbDescriptor *>(
133+ reinterpret_cast <uint8_t *>(ptr) + sizeof (AvbDescriptor) + __builtin_bswap64 (ptr->num_bytes ));
134+ return *this ;
135+ }
136+ };
137+
138+ struct AvbDescriptorRange {
139+ AvbDescriptor *first, *last;
140+ AvbDescriptorIterator begin () const { return {first}; }
141+ AvbDescriptorIterator end () const { return {last}; }
142+ };
143+
144+ inline AvbDescriptorRange AvbVBMetaImageHeader::descriptors () const {
145+ auto *base = reinterpret_cast <const uint8_t *>(this ) + sizeof (AvbVBMetaImageHeader);
146+ base += __builtin_bswap64 (authentication_data_block_size);
147+ base += __builtin_bswap64 (descriptors_offset);
148+ auto *first = reinterpret_cast <AvbDescriptor *>(const_cast <uint8_t *>(base));
149+ auto *last = reinterpret_cast <AvbDescriptor *>(const_cast <uint8_t *>(base) + __builtin_bswap64 (descriptors_size));
150+ return {first, last};
151+ }
152+
97153/* ********************
98154 * Boot Image Headers
99155 *********************/
0 commit comments