int main(int argc, char **argv) { char c; while ((c = getopt(argc, argv, "sph")) != -1) { switch (c) { case 's': new_secret(); return 0; case 'p': show_pubkey(); return 0; case 'h': help(argv[0]); return 0; } } usage(argv[0]); return 1; }
int ft_show_gbb(const char *name, uint8_t *buf, uint32_t len, void *data) { GoogleBinaryBlockHeader *gbb = (GoogleBinaryBlockHeader *)buf; struct bios_state_s *state = (struct bios_state_s *)data; VbPublicKey *pubkey; BmpBlockHeader *bmp; int retval = 0; uint32_t maxlen = 0; if (!len) { printf("GBB header: %s <invalid>\n", name); return 1; } /* It looks like a GBB or we wouldn't be called. */ if (!futil_valid_gbb_header(gbb, len, &maxlen)) retval = 1; printf("GBB header: %s\n", name); printf(" Version: %d.%d\n", gbb->major_version, gbb->minor_version); printf(" Flags: 0x%08x\n", gbb->flags); printf(" Regions: offset size\n"); printf(" hwid 0x%08x 0x%08x\n", gbb->hwid_offset, gbb->hwid_size); printf(" bmpvf 0x%08x 0x%08x\n", gbb->bmpfv_offset, gbb->bmpfv_size); printf(" rootkey 0x%08x 0x%08x\n", gbb->rootkey_offset, gbb->rootkey_size); printf(" recovery_key 0x%08x 0x%08x\n", gbb->recovery_key_offset, gbb->recovery_key_size); printf(" Size: 0x%08x / 0x%08x%s\n", maxlen, len, maxlen > len ? " (not enough)" : ""); if (retval) { printf("GBB header is invalid, ignoring content\n"); return 1; } printf("GBB content:\n"); printf(" HWID: %s\n", buf + gbb->hwid_offset); print_hwid_digest(gbb, " digest: ", "\n"); pubkey = (VbPublicKey *)(buf + gbb->rootkey_offset); if (PublicKeyLooksOkay(pubkey, gbb->rootkey_size)) { if (state) { state->rootkey.offset = state->area[BIOS_FMAP_GBB].offset + gbb->rootkey_offset; state->rootkey.buf = buf + gbb->rootkey_offset; state->rootkey.len = gbb->rootkey_size; state->rootkey.is_valid = 1; } printf(" Root Key:\n"); show_pubkey(pubkey, " "); } else { retval = 1; printf(" Root Key: <invalid>\n"); } pubkey = (VbPublicKey *)(buf + gbb->recovery_key_offset); if (PublicKeyLooksOkay(pubkey, gbb->recovery_key_size)) { if (state) { state->recovery_key.offset = state->area[BIOS_FMAP_GBB].offset + gbb->recovery_key_offset; state->recovery_key.buf = buf + gbb->recovery_key_offset; state->recovery_key.len = gbb->recovery_key_size; state->recovery_key.is_valid = 1; } printf(" Recovery Key:\n"); show_pubkey(pubkey, " "); } else { retval = 1; printf(" Recovery Key: <invalid>\n"); } bmp = (BmpBlockHeader *)(buf + gbb->bmpfv_offset); if (0 != memcmp(bmp, BMPBLOCK_SIGNATURE, BMPBLOCK_SIGNATURE_SIZE)) { printf(" BmpBlock: <invalid>\n"); /* We don't support older BmpBlock formats, so we can't * be strict about this. */ } else { printf(" BmpBlock:\n"); printf(" Version: %d.%d\n", bmp->major_version, bmp->minor_version); printf(" Localizations: %d\n", bmp->number_of_localizations); printf(" Screen layouts: %d\n", bmp->number_of_screenlayouts); printf(" Image infos: %d\n", bmp->number_of_imageinfos); } if (!retval && state) state->area[BIOS_FMAP_GBB].is_valid = 1; return retval; }