diff options
author | Bill Richardson <wfrichar@chromium.org> | 2015-03-26 15:31:54 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-03-31 06:28:05 +0000 |
commit | 35c69cc159af325261a1365cce28f6ecf106307f (patch) | |
tree | 7e71d18af8d4eec7bfc1d38ad3911bdc345947d7 | |
parent | 45ecc3d44746531ab6792442dc0b2a71f5a712f0 (diff) | |
download | vboot-35c69cc159af325261a1365cce28f6ecf106307f.tar.gz |
futility: put the recognizer functions in file_type.inc
This is preparation for a refactoring of how files are traversed.
file_type.inc will specify functions to recognize, show, or sign
each type of file.
This change puts the recognizer functions in file_type.inc, but
just stubs out the show and sign commands.
BUG=chromium:231574
BRANCH=none
TEST=make runtests
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Change-Id: I1596a21319a8fb1182537abdf9be0196bef4b84b
Reviewed-on: https://chromium-review.googlesource.com/262893
Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r-- | futility/file_type.c | 88 | ||||
-rw-r--r-- | futility/file_type.h | 29 | ||||
-rw-r--r-- | futility/file_type.inc | 82 | ||||
-rw-r--r-- | futility/misc.c | 4 | ||||
-rw-r--r-- | futility/traversal.c | 2 | ||||
-rw-r--r-- | futility/vb1_helper.c | 4 | ||||
-rw-r--r-- | futility/vb2_helper.c | 6 |
7 files changed, 126 insertions, 89 deletions
diff --git a/futility/file_type.c b/futility/file_type.c index 11b6dda3..aa017138 100644 --- a/futility/file_type.c +++ b/futility/file_type.c @@ -18,45 +18,53 @@ #include "futility.h" #include "gbb_header.h" -/* Human-readable strings */ -static const struct { - const char * const name; - const char * const desc; -} type_strings[] = { -#define FILE_TYPE(A, B, C) {B, C}, +/* Description and functions to handle each file type */ +struct futil_file_type_s { + /* Short name for this type */ + const char *name; + /* Human-readable description */ + const char *desc; + /* Functions to identify, display, and sign this type of file. */ + enum futil_file_type (*recognize)(uint8_t *buf, uint32_t len); + int (*show)(const char *name, uint8_t *buf, uint32_t len, void *data); + int (*sign)(const char *name, uint8_t *buf, uint32_t len, void *data); +}; + +/* Populate a list of file types and operator functions. */ +static const struct futil_file_type_s const futil_file_types[] = { + {"unknown", "not something we know about", 0, 0, 0}, +#define R_(x) x +#define S_(x) x +#define NONE 0 +#define FILE_TYPE(A, B, C, D, E, F) {B, C, D, E, F}, #include "file_type.inc" #undef FILE_TYPE +#undef NONE +#undef S_ +#undef R_ }; const char * const futil_file_type_name(enum futil_file_type type) { - if ((int) type < 0 || type >= NUM_FILE_TYPES) - type = FILE_TYPE_UNKNOWN; - - return type_strings[type].name; + return futil_file_types[type].name; } const char * const futil_file_type_desc(enum futil_file_type type) { - if ((int) type < 0 || type >= NUM_FILE_TYPES) - type = FILE_TYPE_UNKNOWN; - - return type_strings[type].desc; + return futil_file_types[type].desc; } /* Name to enum. Returns true on success. */ -int futil_file_str_to_type(const char *str, enum futil_file_type *tptr) +int futil_str_to_file_type(const char *str, enum futil_file_type *type) { int i; for (i = 0; i < NUM_FILE_TYPES; i++) - if (!strcasecmp(str, type_strings[i].name)) { - if (tptr) - *tptr = i; + if (!strcasecmp(str, futil_file_types[i].name)) { + *type = i; return 1; } - if (tptr) - *tptr = FILE_TYPE_UNKNOWN; + *type = FILE_TYPE_UNKNOWN; return 0; } @@ -66,49 +74,25 @@ void print_file_types_and_exit(int retval) int i; printf("\nValid file types are:\n\n"); for (i = 0; i < NUM_FILE_TYPES; i++) - printf(" %-20s%s\n", type_strings[i].name, - type_strings[i].desc); + printf(" %-20s%s\n", futil_file_types[i].name, + futil_file_types[i].desc); printf("\n"); exit(retval); } -/* Try these in order so we recognize the larger objects first */ -enum futil_file_type (*recognizers[])(uint8_t *buf, uint32_t len) = { - &recognize_gpt, - &recognize_bios_image, - &recognize_gbb, - &recognize_vblock1, - &recognize_vb1_key, - &recognize_vb2_key, - &recognize_pem, -}; - -int futil_str_to_file_type(const char *str, enum futil_file_type *type) -{ - int i; - for (i = 0; i < NUM_FILE_TYPES; i++) - if (!strcasecmp(str, type_strings[i].name)) - break; - if (i < NUM_FILE_TYPES) { - *type = i; - return 1; - } - - return 0; -} - - /* Try to figure out what we're looking at */ enum futil_file_type futil_file_type_buf(uint8_t *buf, uint32_t len) { enum futil_file_type type; int i; - for (i = 0; i < ARRAY_SIZE(recognizers); i++) { - type = recognizers[i](buf, len); - if (type != FILE_TYPE_UNKNOWN) - return type; + for (i = 0; i < NUM_FILE_TYPES; i++) { + if (futil_file_types[i].recognize) { + type = futil_file_types[i].recognize(buf, len); + if (type != FILE_TYPE_UNKNOWN) + return type; + } } return FILE_TYPE_UNKNOWN; diff --git a/futility/file_type.h b/futility/file_type.h index 47b40992..58e14383 100644 --- a/futility/file_type.h +++ b/futility/file_type.h @@ -8,7 +8,8 @@ /* What type of things do I know how to handle? */ enum futil_file_type { -#define FILE_TYPE(A, B, C) FILE_TYPE_ ## A, + FILE_TYPE_UNKNOWN, +#define FILE_TYPE(A, B, C, D, E, F) FILE_TYPE_ ## A, #include "file_type.inc" #undef FILE_TYPE NUM_FILE_TYPES @@ -16,16 +17,14 @@ enum futil_file_type { /* Short name for file types */ const char * const futil_file_type_name(enum futil_file_type type); + /* Description of file type */ const char * const futil_file_type_desc(enum futil_file_type type); -/* Name to enum. Returns true on success. */ -int futil_file_str_to_type(const char *str, enum futil_file_type *tptr); - /* Print the list of type names and exit with the given value. */ void print_file_types_and_exit(int retval); -/* Lookup an type by name. Return true on success */ +/* Lookup a type by name. Return true on success */ int futil_str_to_file_type(const char *str, enum futil_file_type *type); /* @@ -40,13 +39,17 @@ enum futil_file_type futil_file_type_buf(uint8_t *buf, uint32_t len); enum futil_file_err futil_file_type(const char *filename, enum futil_file_type *type); -/* Routines to identify particular file types. */ -enum futil_file_type recognize_bios_image(uint8_t *buf, uint32_t len); -enum futil_file_type recognize_gbb(uint8_t *buf, uint32_t len); -enum futil_file_type recognize_vblock1(uint8_t *buf, uint32_t len); -enum futil_file_type recognize_gpt(uint8_t *buf, uint32_t len); -enum futil_file_type recognize_vb1_key(uint8_t *buf, uint32_t len); -enum futil_file_type recognize_vb2_key(uint8_t *buf, uint32_t len); -enum futil_file_type recognize_pem(uint8_t *buf, uint32_t len); +/* Declare the file_type functions. */ +#define R_(FOO) \ + enum futil_file_type FOO(uint8_t *buf, uint32_t len); +#define S_(FOO) \ + int FOO(const char *name, uint8_t *buf, uint32_t len, void *data); +#define NONE +#define FILE_TYPE(A, B, C, D, E, F) D E F +#include "file_type.inc" +#undef FILE_TYPE +#undef NONE +#undef S_ +#undef R_ #endif /* VBOOT_REFERENCE_FUTILITY_FILE_TYPE_H_ */ diff --git a/futility/file_type.inc b/futility/file_type.inc index d003b116..076c9408 100644 --- a/futility/file_type.inc +++ b/futility/file_type.inc @@ -3,21 +3,71 @@ * Copyright 2015 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. + * + * This declares the file types that we can handle. Note that the order may be + * important for types with recognizer functions, since we generally want to to + * look for big things first. */ -/* enum --type desc */ -FILE_TYPE(UNKNOWN, "unknown", "not something we know about") -FILE_TYPE(PUBKEY, "pubkey", "VbPublicKey (.vbpubk)") -FILE_TYPE(KEYBLOCK, "keyblock", "VbKeyBlock") -FILE_TYPE(FW_PREAMBLE, "fw_pre", "VbFirmwarePreamble (VBLOCK_A/B)") -FILE_TYPE(GBB, "gbb", "GBB") -FILE_TYPE(BIOS_IMAGE, "bios", "Chrome OS BIOS image") -FILE_TYPE(OLD_BIOS_IMAGE, "oldbios", "Cr-48 Chrome OS BIOS image") -FILE_TYPE(KERN_PREAMBLE, "kernel", "kernel preamble/partition") -FILE_TYPE(RAW_FIRMWARE, "fwblob", "raw firmware blob (FW_MAIN_A/B)") -FILE_TYPE(RAW_KERNEL, "vmlinuz", "raw linux kernel") -FILE_TYPE(CHROMIUMOS_DISK, "disk_img", "chromiumos disk image") -FILE_TYPE(PRIVKEY, "prikey", "VbPrivateKey (.vbprivk)") -FILE_TYPE(VB2_PUBKEY, "pubkey21", "vb21 public key (.vbpubk2)") -FILE_TYPE(VB2_PRIVKEY, "prikey21", "vb21 private key (.vbprik2)") -FILE_TYPE(PEM, "pem", "RSA private key (.pem)") +/* + * enum --type desc + * recognizer function + * show function + * sign function + */ +FILE_TYPE(PUBKEY, "pubkey", "VbPublicKey (.vbpubk)", + R_(ft_recognize_vb1_key), + NONE, + NONE) +FILE_TYPE(KEYBLOCK, "keyblock", "VbKeyBlock", + R_(ft_recognize_vblock1), + NONE, + NONE) +FILE_TYPE(FW_PREAMBLE, "fw_pre", "VbFirmwarePreamble (VBLOCK_A/B)", + R_(ft_recognize_vblock1), + NONE, + NONE) +FILE_TYPE(GBB, "gbb", "GBB", + R_(ft_recognize_gbb), + NONE, + NONE) +FILE_TYPE(BIOS_IMAGE, "bios", "Chrome OS BIOS image", + R_(ft_recognize_bios_image), + NONE, + NONE) +FILE_TYPE(OLD_BIOS_IMAGE, "oldbios", "Cr-48 Chrome OS BIOS image", + R_(ft_recognize_bios_image), + NONE, + NONE) +FILE_TYPE(KERN_PREAMBLE, "kernel", "kernel preamble/partition", + R_(ft_recognize_vblock1), + NONE, + NONE) +FILE_TYPE(RAW_FIRMWARE, "fwblob", "raw firmware blob (FW_MAIN_A/B)", + NONE, + NONE, + NONE) +FILE_TYPE(RAW_KERNEL, "vmlinuz", "raw linux kernel", + NONE, + NONE, + NONE) +FILE_TYPE(CHROMIUMOS_DISK, "disk_img", "chromiumos disk image", + NONE, + NONE, + NONE) +FILE_TYPE(PRIVKEY, "prikey", "VbPrivateKey (.vbprivk)", + R_(ft_recognize_vb1_key), + NONE, + NONE) +FILE_TYPE(VB2_PUBKEY, "pubkey21", "vb21 public key (.vbpubk2)", + R_(ft_recognize_vb2_key), + NONE, + NONE) +FILE_TYPE(VB2_PRIVKEY, "prikey21", "vb21 private key (.vbprik2)", + R_(ft_recognize_vb2_key), + NONE, + NONE) +FILE_TYPE(PEM, "pem", "RSA private key (.pem)", + R_(ft_recognize_pem), + NONE, + NONE) diff --git a/futility/misc.c b/futility/misc.c index c002a134..1e91eb88 100644 --- a/futility/misc.c +++ b/futility/misc.c @@ -56,7 +56,7 @@ static inline uint32_t max(uint32_t a, uint32_t b) return a > b ? a : b; } -enum futil_file_type recognize_gbb(uint8_t *buf, uint32_t len) +enum futil_file_type ft_recognize_gbb(uint8_t *buf, uint32_t len) { GoogleBinaryBlockHeader *gbb = (GoogleBinaryBlockHeader *)buf; @@ -301,7 +301,7 @@ enum futil_file_err futil_unmap_file(int fd, int writeable, #define DISK_SECTOR_SIZE 512 -enum futil_file_type recognize_gpt(uint8_t *buf, uint32_t len) +enum futil_file_type ft_recognize_gpt(uint8_t *buf, uint32_t len) { GptHeader *h; diff --git a/futility/traversal.c b/futility/traversal.c index 548d9538..413ec83c 100644 --- a/futility/traversal.c +++ b/futility/traversal.c @@ -133,7 +133,7 @@ static int has_all_areas(uint8_t *buf, uint32_t len, FmapHeader *fmap, return 1; } -enum futil_file_type recognize_bios_image(uint8_t *buf, uint32_t len) +enum futil_file_type ft_recognize_bios_image(uint8_t *buf, uint32_t len) { FmapHeader *fmap = fmap_find(buf, len); if (fmap) { diff --git a/futility/vb1_helper.c b/futility/vb1_helper.c index e039e41b..b93fe6e7 100644 --- a/futility/vb1_helper.c +++ b/futility/vb1_helper.c @@ -715,7 +715,7 @@ uint8_t *CreateKernelBlob(uint8_t *vmlinuz_buf, uint64_t vmlinuz_size, return g_kernel_blob_data; } -enum futil_file_type recognize_vblock1(uint8_t *buf, uint32_t len) +enum futil_file_type ft_recognize_vblock1(uint8_t *buf, uint32_t len) { VbKeyBlockHeader *key_block = (VbKeyBlockHeader *)buf; VbFirmwarePreambleHeader *fw_preamble; @@ -745,7 +745,7 @@ enum futil_file_type recognize_vblock1(uint8_t *buf, uint32_t len) return FILE_TYPE_UNKNOWN; } -enum futil_file_type recognize_vb1_key(uint8_t *buf, uint32_t len) +enum futil_file_type ft_recognize_vb1_key(uint8_t *buf, uint32_t len) { VbPublicKey *pubkey = (VbPublicKey *)buf; VbPrivateKey key; diff --git a/futility/vb2_helper.c b/futility/vb2_helper.c index 686b8333..35ca4780 100644 --- a/futility/vb2_helper.c +++ b/futility/vb2_helper.c @@ -23,7 +23,7 @@ #include "futility.h" #include "traversal.h" -enum futil_file_type recognize_vb2_key(uint8_t *buf, uint32_t len) +enum futil_file_type ft_recognize_vb2_key(uint8_t *buf, uint32_t len) { struct vb2_public_key pubkey; struct vb2_private_key *privkey = 0; @@ -168,7 +168,7 @@ static RSA *rsa_from_buffer(uint8_t *buf, uint32_t len) return rsa_key; } -enum futil_file_type recognize_pem(uint8_t *buf, uint32_t len) +enum futil_file_type ft_recognize_pem(uint8_t *buf, uint32_t len) { RSA *rsa_key = rsa_from_buffer(buf, len); @@ -189,7 +189,7 @@ int futil_cb_show_pem(struct futil_traverse_state_s *state) printf("Private Key file: %s\n", state->in_filename); - /* We're called only after recognize_pem, so this should work. */ + /* We're called only after ft_recognize_pem, so this should work. */ rsa_key = rsa_from_buffer(state->my_area->buf, state->my_area->len); if (!rsa_key) DIE; |