MCPcopy Create free account
hub / github.com/coreboot/coreboot / mediatek_find_hash

Function mediatek_find_hash

util/cbfstool/platform_fixups.c:232–281  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

230#define MEDIATEK_BOOTBLOCK_HEADER_SIZE 2048
231#define MEDIATEK_BOOTBLOCK_GFH_SIZE 176
232static void *mediatek_find_hash(struct buffer *bootblock, struct vb2_hash *real_hash)
233{
234 struct buffer buffer;
235 size_t data_size;
236 const char emmc_magic[] = "EMMC_BOOT";
237 const char sf_magic[] = "SF_BOOT";
238 const char brlyt_magic[] = "BRLYT";
239 const size_t brlyt_offset = 512;
240
241 buffer_clone(&buffer, bootblock);
242
243 /* Doesn't seem to be MediaTek image */
244 if (buffer_size(&buffer) <
245 MEDIATEK_BOOTBLOCK_HEADER_SIZE + MEDIATEK_BOOTBLOCK_GFH_SIZE)
246 return NULL;
247
248 /* Check header magic */
249 if (!buffer_check_magic(&buffer, emmc_magic, strlen(emmc_magic)) &&
250 !buffer_check_magic(&buffer, sf_magic, strlen(sf_magic)))
251 return NULL;
252
253 /* Check "BRLYT" */
254 buffer_seek(&buffer, brlyt_offset);
255 if (!buffer_check_magic(&buffer, brlyt_magic, strlen(brlyt_magic)))
256 return NULL;
257
258 buffer_seek(&buffer, MEDIATEK_BOOTBLOCK_HEADER_SIZE - brlyt_offset);
259 data_size = read_le32(buffer_get(&buffer) + 32);
260 if (data_size <= MEDIATEK_BOOTBLOCK_GFH_SIZE + VB2_SHA256_DIGEST_SIZE) {
261 ERROR("fixups: MediaTek: data size too small: %zu\n", data_size);
262 return NULL;
263 }
264 data_size -= MEDIATEK_BOOTBLOCK_GFH_SIZE + VB2_SHA256_DIGEST_SIZE;
265
266 if (buffer_size(&buffer) <
267 MEDIATEK_BOOTBLOCK_GFH_SIZE + data_size + VB2_SHA256_DIGEST_SIZE) {
268 ERROR("fixups: MediaTek: not enough data: %zu\n", buffer_size(&buffer));
269 return NULL;
270 }
271
272 if (vb2_hash_calculate(false, buffer_get(&buffer),
273 MEDIATEK_BOOTBLOCK_GFH_SIZE + data_size,
274 VB2_HASH_SHA256, real_hash)) {
275 ERROR("fixups: MediaTek: vboot digest error\n");
276 return NULL;
277 }
278
279 buffer_seek(&buffer, MEDIATEK_BOOTBLOCK_GFH_SIZE + data_size);
280 return buffer_get(&buffer);
281}
282
283static bool mediatek_probe(struct buffer *buffer)
284{

Callers 2

mediatek_probeFunction · 0.85
mediatek_fixupFunction · 0.85

Calls 7

buffer_cloneFunction · 0.85
buffer_sizeFunction · 0.85
buffer_check_magicFunction · 0.85
strlenFunction · 0.85
buffer_seekFunction · 0.85
read_le32Function · 0.85
buffer_getFunction · 0.85

Tested by

no test coverage detected