| /* |
| * Copyright (c) 2013 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. |
| */ |
| #ifndef VBOOT_REFERENCE_FUTILITY_TRAVERSAL_H_ |
| #define VBOOT_REFERENCE_FUTILITY_TRAVERSAL_H_ |
| #include <stdint.h> |
| |
| |
| /* What type of things do I know how to handle? */ |
| enum futil_file_type { |
| FILE_TYPE_UNKNOWN = 0, |
| FILE_TYPE_PUBKEY, /* 1 VbPublicKey */ |
| FILE_TYPE_KEYBLOCK, /* 2 VbKeyBlockHeader */ |
| FILE_TYPE_FIRMWARE, /* 3 VbFirmwarePreambleHeader */ |
| FILE_TYPE_GBB, /* 4 GoogleBinaryBlockHeader */ |
| FILE_TYPE_BIOS_IMAGE, /* 5 Chrome OS BIOS image */ |
| FILE_TYPE_OLD_BIOS_IMAGE, /* 6 Old Chrome OS BIOS image */ |
| |
| NUM_FILE_TYPES |
| }; |
| |
| /* What are we trying to accomplish? */ |
| enum futil_op_type { |
| FUTIL_OP_SHOW, |
| FUTIL_OP_SIGN, |
| |
| NUM_FUTIL_OPS |
| }; |
| |
| /* What component are we currently handling in the callback routine? */ |
| enum futil_cb_component { |
| /* entire input buffer */ |
| CB_BEGIN_TRAVERSAL, |
| CB_END_TRAVERSAL, |
| /* fmap areas within a bios image */ |
| CB_FMAP_GBB, |
| CB_FMAP_VBLOCK_A, |
| CB_FMAP_VBLOCK_B, |
| CB_FMAP_FW_MAIN_A, |
| CB_FMAP_FW_MAIN_B, |
| /* individual files (extracted from a bios, for example) */ |
| CB_PUBKEY, |
| CB_KEYBLOCK, |
| CB_GBB, |
| CB_FW_PREAMBLE, |
| |
| NUM_CB_COMPONENTS |
| }; |
| |
| /* Where is the component we're poking at? */ |
| struct cb_area_s { |
| uint32_t offset; /* to avoid pointer math */ |
| uint8_t *buf; |
| uint32_t len; |
| uint32_t _flags; /* for callback use */ |
| }; |
| |
| /* What do we know at this point in time? */ |
| struct futil_traverse_state_s { |
| /* These two should be initialized by the caller as needed */ |
| const char *in_filename; |
| enum futil_op_type op; |
| /* Current activity during traversal */ |
| enum futil_cb_component component; |
| struct cb_area_s *my_area; |
| const char *name; |
| /* Other activites, possibly before or after the current one */ |
| struct cb_area_s cb_area[NUM_CB_COMPONENTS]; |
| struct cb_area_s recovery_key; |
| struct cb_area_s rootkey; |
| enum futil_file_type in_type; |
| int errors; |
| }; |
| |
| /* |
| * Traverse the input file using the provided state |
| * Return nonzero (but no details) if there were any errors. |
| */ |
| int futil_traverse(int ifd, struct futil_traverse_state_s *state, |
| int writeable); |
| |
| /* These are invoked by the traversal. They also return nonzero on error. */ |
| int futil_cb_show_begin(struct futil_traverse_state_s *state); |
| int futil_cb_show_key(struct futil_traverse_state_s *state); |
| int futil_cb_show_gbb(struct futil_traverse_state_s *state); |
| int futil_cb_show_keyblock(struct futil_traverse_state_s *state); |
| int futil_cb_show_fw_main(struct futil_traverse_state_s *state); |
| int futil_cb_show_fw_preamble(struct futil_traverse_state_s *state); |
| |
| int futil_cb_sign_bogus(struct futil_traverse_state_s *state); |
| int futil_cb_sign_notyet(struct futil_traverse_state_s *state); |
| int futil_cb_sign_fw_main(struct futil_traverse_state_s *state); |
| int futil_cb_sign_fw_preamble(struct futil_traverse_state_s *state); |
| int futil_cb_sign_begin(struct futil_traverse_state_s *state); |
| int futil_cb_sign_end(struct futil_traverse_state_s *state); |
| |
| |
| #endif /* VBOOT_REFERENCE_FUTILITY_TRAVERSAL_H_ */ |