| /* |
| * 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 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, |
| CB_KERN_PREAMBLE, |
| CB_RAW_FIRMWARE, |
| CB_RAW_KERNEL, |
| CB_PRIVKEY, |
| |
| 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 buffer using the provided state, which should be initialized |
| * before calling. Returns nonzero (but no details) if there were any errors. |
| */ |
| int futil_traverse(uint8_t *buf, uint32_t len, |
| struct futil_traverse_state_s *state, |
| enum futil_file_type type_hint); |
| |
| /* 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_pubkey(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_show_kernel_preamble(struct futil_traverse_state_s *state); |
| int futil_cb_show_privkey(struct futil_traverse_state_s *state); |
| |
| int futil_cb_sign_pubkey(struct futil_traverse_state_s *state); |
| int futil_cb_sign_fw_main(struct futil_traverse_state_s *state); |
| int futil_cb_sign_fw_vblock(struct futil_traverse_state_s *state); |
| int futil_cb_sign_raw_firmware(struct futil_traverse_state_s *state); |
| int futil_cb_resign_kernel_part(struct futil_traverse_state_s *state); |
| int futil_cb_create_kernel_part(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_ */ |