xref: /aosp_15_r20/external/vboot_reference/utility/include/gbb_utility.h (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2010 The ChromiumOS Authors
2*8617a60dSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
3*8617a60dSAndroid Build Coastguard Worker  * found in the LICENSE file.
4*8617a60dSAndroid Build Coastguard Worker  */
5*8617a60dSAndroid Build Coastguard Worker 
6*8617a60dSAndroid Build Coastguard Worker #ifndef VBOOT_REFERENCE_GBB_UTILITY_H_
7*8617a60dSAndroid Build Coastguard Worker #define VBOOT_REFERENCE_GBB_UTILITY_H_
8*8617a60dSAndroid Build Coastguard Worker 
9*8617a60dSAndroid Build Coastguard Worker #include <string>
10*8617a60dSAndroid Build Coastguard Worker #include <vector>
11*8617a60dSAndroid Build Coastguard Worker 
12*8617a60dSAndroid Build Coastguard Worker namespace vboot_reference {
13*8617a60dSAndroid Build Coastguard Worker 
14*8617a60dSAndroid Build Coastguard Worker class GoogleBinaryBlockUtil {
15*8617a60dSAndroid Build Coastguard Worker  public:
16*8617a60dSAndroid Build Coastguard Worker   // enumerate of available data fields
17*8617a60dSAndroid Build Coastguard Worker   enum PROPINDEX {
18*8617a60dSAndroid Build Coastguard Worker     PROP_FLAGS = -1,// flags (virtual property)
19*8617a60dSAndroid Build Coastguard Worker     PROP_HWID,      // hardware id
20*8617a60dSAndroid Build Coastguard Worker     PROP_ROOTKEY,   // root key
21*8617a60dSAndroid Build Coastguard Worker     PROP_BMPFV,     // bitmap FV
22*8617a60dSAndroid Build Coastguard Worker     PROP_RCVKEY,    // recovery key
23*8617a60dSAndroid Build Coastguard Worker     PROP_RANGE,     // indicator of valid property range
24*8617a60dSAndroid Build Coastguard Worker   };
25*8617a60dSAndroid Build Coastguard Worker 
26*8617a60dSAndroid Build Coastguard Worker   GoogleBinaryBlockUtil();
27*8617a60dSAndroid Build Coastguard Worker   ~GoogleBinaryBlockUtil();
28*8617a60dSAndroid Build Coastguard Worker 
29*8617a60dSAndroid Build Coastguard Worker   // load GBB from a BIOS image file.
30*8617a60dSAndroid Build Coastguard Worker   // return true if a valid GBB was retrieved.
31*8617a60dSAndroid Build Coastguard Worker   bool load_from_file(const char *filename);
32*8617a60dSAndroid Build Coastguard Worker 
33*8617a60dSAndroid Build Coastguard Worker   // save loaded (and modified) GBB with BIOS image to new file
34*8617a60dSAndroid Build Coastguard Worker   // return true on success.
35*8617a60dSAndroid Build Coastguard Worker   bool save_to_file(const char *filename);
36*8617a60dSAndroid Build Coastguard Worker 
37*8617a60dSAndroid Build Coastguard Worker   // create a new GBB blob by providing a list of reserved data size for each
38*8617a60dSAndroid Build Coastguard Worker   // properties, following the order described in vb2_gbb_header.
39*8617a60dSAndroid Build Coastguard Worker   // return true on success.
40*8617a60dSAndroid Build Coastguard Worker   bool create_new(const std::vector<uint32_t> &create_param);
41*8617a60dSAndroid Build Coastguard Worker 
42*8617a60dSAndroid Build Coastguard Worker   // retrieve the value of GBB header flags.
43*8617a60dSAndroid Build Coastguard Worker   // return the flags value.
44*8617a60dSAndroid Build Coastguard Worker   uint32_t get_flags() const;
45*8617a60dSAndroid Build Coastguard Worker 
46*8617a60dSAndroid Build Coastguard Worker   // overwrite GBB header flags.
47*8617a60dSAndroid Build Coastguard Worker   // return true on success.
48*8617a60dSAndroid Build Coastguard Worker   bool set_flags(const uint32_t flags);
49*8617a60dSAndroid Build Coastguard Worker 
50*8617a60dSAndroid Build Coastguard Worker   // retrieve the value of a property from GBB data.
51*8617a60dSAndroid Build Coastguard Worker   // return the property value.
52*8617a60dSAndroid Build Coastguard Worker   std::string get_property(PROPINDEX i) const;
53*8617a60dSAndroid Build Coastguard Worker 
54*8617a60dSAndroid Build Coastguard Worker   // overwrite a property in GBB data.
55*8617a60dSAndroid Build Coastguard Worker   // return true on success.
56*8617a60dSAndroid Build Coastguard Worker   bool set_property(PROPINDEX i, const std::string &value);
57*8617a60dSAndroid Build Coastguard Worker 
58*8617a60dSAndroid Build Coastguard Worker   // get a readable name by a property index.
59*8617a60dSAndroid Build Coastguard Worker   // return the name for valid properties, otherwise unexpected empty string.
60*8617a60dSAndroid Build Coastguard Worker   std::string get_property_name(PROPINDEX i) const;
61*8617a60dSAndroid Build Coastguard Worker 
62*8617a60dSAndroid Build Coastguard Worker   // quick getters and setters of known properties in GBB
63*8617a60dSAndroid Build Coastguard Worker   bool set_hwid(const char *hwid);      // NOTE: hwid is NUL-terminated.
64*8617a60dSAndroid Build Coastguard Worker   bool set_rootkey(const std::string &value);
65*8617a60dSAndroid Build Coastguard Worker   bool set_bmpfv(const std::string &value);
66*8617a60dSAndroid Build Coastguard Worker   bool set_recovery_key(const std::string &value);
get_hwid()67*8617a60dSAndroid Build Coastguard Worker   std::string get_hwid() const { return get_property(PROP_HWID); }
get_rootkey()68*8617a60dSAndroid Build Coastguard Worker   std::string get_rootkey() const { return get_property(PROP_ROOTKEY); }
get_bmpfv()69*8617a60dSAndroid Build Coastguard Worker   std::string get_bmpfv() const { return get_property(PROP_BMPFV); }
get_recovery_key()70*8617a60dSAndroid Build Coastguard Worker   std::string get_recovery_key() const { return get_property(PROP_RCVKEY); }
71*8617a60dSAndroid Build Coastguard Worker 
72*8617a60dSAndroid Build Coastguard Worker  private:
73*8617a60dSAndroid Build Coastguard Worker   // clear all cached data and initialize to original state
74*8617a60dSAndroid Build Coastguard Worker   void initialize();
75*8617a60dSAndroid Build Coastguard Worker 
76*8617a60dSAndroid Build Coastguard Worker   // search and count for GBB signatures in loaded image.
77*8617a60dSAndroid Build Coastguard Worker   // return the number of signatures found.
78*8617a60dSAndroid Build Coastguard Worker   int search_header_signatures(const std::string &image, long *poffset) const;
79*8617a60dSAndroid Build Coastguard Worker 
80*8617a60dSAndroid Build Coastguard Worker   // load and check header structure from image by given offset.
81*8617a60dSAndroid Build Coastguard Worker   // return true if a valid GBB header is loaded into *phdr.
82*8617a60dSAndroid Build Coastguard Worker   bool load_gbb_header(const std::string &image, long offset,
83*8617a60dSAndroid Build Coastguard Worker                        struct vb2_gbb_header *phdr) const;
84*8617a60dSAndroid Build Coastguard Worker 
85*8617a60dSAndroid Build Coastguard Worker   // find the size, offset, and name information for given property.
86*8617a60dSAndroid Build Coastguard Worker   // return true if the offset and size are assign to *poffset and *psize;
87*8617a60dSAndroid Build Coastguard Worker   // if pname is not NULL, *pname will hold a pointer to a readable name.
88*8617a60dSAndroid Build Coastguard Worker   // return false if the property index is invalid.
89*8617a60dSAndroid Build Coastguard Worker   bool find_property(PROPINDEX i, uint32_t *poffset, uint32_t *psize,
90*8617a60dSAndroid Build Coastguard Worker                      const char **pname) const;
91*8617a60dSAndroid Build Coastguard Worker 
92*8617a60dSAndroid Build Coastguard Worker   struct vb2_gbb_header header_;        // copy of GBB header from image
93*8617a60dSAndroid Build Coastguard Worker   std::string file_content_;            // complete image file content
94*8617a60dSAndroid Build Coastguard Worker   long header_offset_;                  // offset to GBB header in file_content_
95*8617a60dSAndroid Build Coastguard Worker   bool is_valid_gbb;                    // if we are holding a valid GBB
96*8617a60dSAndroid Build Coastguard Worker 
97*8617a60dSAndroid Build Coastguard Worker   bool verbose;                         // provide verbose messages
98*8617a60dSAndroid Build Coastguard Worker };
99*8617a60dSAndroid Build Coastguard Worker 
100*8617a60dSAndroid Build Coastguard Worker }  // namespace vboot_reference
101*8617a60dSAndroid Build Coastguard Worker 
102*8617a60dSAndroid Build Coastguard Worker #endif  /* VBOOT_REFERENCE_GBB_UTILITY_H_ */
103