| 230 | #define MEDIATEK_BOOTBLOCK_HEADER_SIZE 2048 |
| 231 | #define MEDIATEK_BOOTBLOCK_GFH_SIZE 176 |
| 232 | static 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 | |
| 283 | static bool mediatek_probe(struct buffer *buffer) |
| 284 | { |
no test coverage detected