1 /*
2  * Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
3  * Use of this source code is governed by a BSD-style license that can be
4  * found in the LICENSE file.
5  */
6 #ifndef VBOOT_REFERENCE_FUTILITY_TRAVERSAL_H_
7 #define VBOOT_REFERENCE_FUTILITY_TRAVERSAL_H_
8 #include <stdint.h>
9 
10 
11 /* What are we trying to accomplish? */
12 enum futil_op_type {
13 	FUTIL_OP_SHOW,
14 	FUTIL_OP_SIGN,
15 
16 	NUM_FUTIL_OPS
17 };
18 
19 /* What component are we currently handling in the callback routine? */
20 enum futil_cb_component {
21 	/* entire input buffer */
22 	CB_BEGIN_TRAVERSAL,
23 	CB_END_TRAVERSAL,
24 	/* fmap areas within a bios image */
25 	CB_FMAP_GBB,
26 	CB_FMAP_VBLOCK_A,
27 	CB_FMAP_VBLOCK_B,
28 	CB_FMAP_FW_MAIN_A,
29 	CB_FMAP_FW_MAIN_B,
30 	/* individual files (extracted from a bios, for example) */
31 	CB_PUBKEY,
32 	CB_KEYBLOCK,
33 	CB_GBB,
34 	CB_FW_PREAMBLE,
35 	CB_KERN_PREAMBLE,
36 	CB_RAW_FIRMWARE,
37 	CB_RAW_KERNEL,
38 	CB_PRIVKEY,
39 
40 	NUM_CB_COMPONENTS
41 };
42 
43 /* Where is the component we're poking at? */
44 struct cb_area_s {
45 	uint32_t offset;			/* to avoid pointer math */
46 	uint8_t *buf;
47 	uint32_t len;
48 	uint32_t _flags;			/* for callback use */
49 };
50 
51 /* What do we know at this point in time? */
52 struct futil_traverse_state_s {
53 	/* These two should be initialized by the caller as needed */
54 	const char *in_filename;
55 	enum futil_op_type op;
56 	/* Current activity during traversal */
57 	enum futil_cb_component component;
58 	struct cb_area_s *my_area;
59 	const char *name;
60 	/* Other activites, possibly before or after the current one */
61 	struct cb_area_s cb_area[NUM_CB_COMPONENTS];
62 	struct cb_area_s recovery_key;
63 	struct cb_area_s rootkey;
64 	enum futil_file_type in_type;
65 	int errors;
66 };
67 
68 
69 /*
70  * Traverse the buffer using the provided state, which should be initialized
71  * before calling. Returns nonzero (but no details) if there were any errors.
72  */
73 int futil_traverse(uint8_t *buf, uint32_t len,
74 		   struct futil_traverse_state_s *state,
75 		   enum futil_file_type type_hint);
76 
77 /* These are invoked by the traversal. They also return nonzero on error. */
78 int futil_cb_show_begin(struct futil_traverse_state_s *state);
79 int futil_cb_show_pubkey(struct futil_traverse_state_s *state);
80 int futil_cb_show_gbb(struct futil_traverse_state_s *state);
81 int futil_cb_show_keyblock(struct futil_traverse_state_s *state);
82 int futil_cb_show_fw_main(struct futil_traverse_state_s *state);
83 int futil_cb_show_fw_preamble(struct futil_traverse_state_s *state);
84 int futil_cb_show_kernel_preamble(struct futil_traverse_state_s *state);
85 int futil_cb_show_privkey(struct futil_traverse_state_s *state);
86 
87 int futil_cb_sign_pubkey(struct futil_traverse_state_s *state);
88 int futil_cb_sign_fw_main(struct futil_traverse_state_s *state);
89 int futil_cb_sign_fw_vblock(struct futil_traverse_state_s *state);
90 int futil_cb_sign_raw_firmware(struct futil_traverse_state_s *state);
91 int futil_cb_resign_kernel_part(struct futil_traverse_state_s *state);
92 int futil_cb_create_kernel_part(struct futil_traverse_state_s *state);
93 int futil_cb_sign_begin(struct futil_traverse_state_s *state);
94 int futil_cb_sign_end(struct futil_traverse_state_s *state);
95 
96 
97 #endif /* VBOOT_REFERENCE_FUTILITY_TRAVERSAL_H_ */
98