1*8617a60dSAndroid Build Coastguard Worker /* Copyright 2013 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 * APIs between calling firmware and vboot_reference
6*8617a60dSAndroid Build Coastguard Worker *
7*8617a60dSAndroid Build Coastguard Worker * General notes:
8*8617a60dSAndroid Build Coastguard Worker *
9*8617a60dSAndroid Build Coastguard Worker * TODO: split this file into a vboot_entry_points.h file which contains the
10*8617a60dSAndroid Build Coastguard Worker * entry points for the firmware to call vboot_reference, and a
11*8617a60dSAndroid Build Coastguard Worker * vboot_firmware_exports.h which contains the APIs to be implemented by the
12*8617a60dSAndroid Build Coastguard Worker * calling firmware and exported to vboot_reference.
13*8617a60dSAndroid Build Coastguard Worker *
14*8617a60dSAndroid Build Coastguard Worker * Notes:
15*8617a60dSAndroid Build Coastguard Worker * * Assumes this code is never called in the S3 resume path. TPM resume
16*8617a60dSAndroid Build Coastguard Worker * must be done elsewhere, and VB2_NV_DEBUG_RESET_MODE is ignored.
17*8617a60dSAndroid Build Coastguard Worker */
18*8617a60dSAndroid Build Coastguard Worker
19*8617a60dSAndroid Build Coastguard Worker #ifndef VBOOT_REFERENCE_2API_H_
20*8617a60dSAndroid Build Coastguard Worker #define VBOOT_REFERENCE_2API_H_
21*8617a60dSAndroid Build Coastguard Worker
22*8617a60dSAndroid Build Coastguard Worker #include "2constants.h"
23*8617a60dSAndroid Build Coastguard Worker #include "2context.h"
24*8617a60dSAndroid Build Coastguard Worker #include "2crypto.h"
25*8617a60dSAndroid Build Coastguard Worker #include "2fw_hash_tags.h"
26*8617a60dSAndroid Build Coastguard Worker #include "2gbb_flags.h"
27*8617a60dSAndroid Build Coastguard Worker #include "2hmac.h"
28*8617a60dSAndroid Build Coastguard Worker #include "2id.h"
29*8617a60dSAndroid Build Coastguard Worker #include "2info.h"
30*8617a60dSAndroid Build Coastguard Worker #include "2recovery_reasons.h"
31*8617a60dSAndroid Build Coastguard Worker #include "2return_codes.h"
32*8617a60dSAndroid Build Coastguard Worker #include "2rsa.h"
33*8617a60dSAndroid Build Coastguard Worker #include "2secdata_struct.h"
34*8617a60dSAndroid Build Coastguard Worker
35*8617a60dSAndroid Build Coastguard Worker #define _VB2_TRY_IMPL(expr, ctx, recovery_reason, ...) do { \
36*8617a60dSAndroid Build Coastguard Worker vb2_error_t _vb2_try_rv = (expr); \
37*8617a60dSAndroid Build Coastguard Worker struct vb2_context *_vb2_try_ctx = (ctx); \
38*8617a60dSAndroid Build Coastguard Worker uint8_t _vb2_try_reason = (recovery_reason); \
39*8617a60dSAndroid Build Coastguard Worker if (_vb2_try_rv != VB2_SUCCESS) { \
40*8617a60dSAndroid Build Coastguard Worker vb2ex_printf(__func__, \
41*8617a60dSAndroid Build Coastguard Worker "%s returned %#x\n", #expr, _vb2_try_rv); \
42*8617a60dSAndroid Build Coastguard Worker if (_vb2_try_rv >= VB2_REQUEST_END && \
43*8617a60dSAndroid Build Coastguard Worker (_vb2_try_ctx) && \
44*8617a60dSAndroid Build Coastguard Worker (_vb2_try_reason) != VB2_RECOVERY_NOT_REQUESTED) \
45*8617a60dSAndroid Build Coastguard Worker vb2api_fail(_vb2_try_ctx, _vb2_try_reason, \
46*8617a60dSAndroid Build Coastguard Worker _vb2_try_rv); \
47*8617a60dSAndroid Build Coastguard Worker return _vb2_try_rv; \
48*8617a60dSAndroid Build Coastguard Worker } \
49*8617a60dSAndroid Build Coastguard Worker } while (0)
50*8617a60dSAndroid Build Coastguard Worker
51*8617a60dSAndroid Build Coastguard Worker /*
52*8617a60dSAndroid Build Coastguard Worker * Evaluate an expression and return *from the caller* on failure or if an
53*8617a60dSAndroid Build Coastguard Worker * action (such as reboot) is requested.
54*8617a60dSAndroid Build Coastguard Worker *
55*8617a60dSAndroid Build Coastguard Worker * This macro supports two forms of usage:
56*8617a60dSAndroid Build Coastguard Worker * 1. VB2_TRY(expr)
57*8617a60dSAndroid Build Coastguard Worker * 2. VB2_TRY(expr, ctx, recovery_reason)
58*8617a60dSAndroid Build Coastguard Worker *
59*8617a60dSAndroid Build Coastguard Worker * When the second form is used, vb2api_fail() will be called on failure before
60*8617a60dSAndroid Build Coastguard Worker * return. Note that nvdata only holds one byte for recovery subcode, so any
61*8617a60dSAndroid Build Coastguard Worker * other more significant bytes will be truncated.
62*8617a60dSAndroid Build Coastguard Worker *
63*8617a60dSAndroid Build Coastguard Worker * @param expr An expression (such as a function call) of type
64*8617a60dSAndroid Build Coastguard Worker * vb2_error_t.
65*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context.
66*8617a60dSAndroid Build Coastguard Worker * @param recovery_reason Recovery reason passed to vb2api_fail().
67*8617a60dSAndroid Build Coastguard Worker */
68*8617a60dSAndroid Build Coastguard Worker #define VB2_TRY(expr, ...) _VB2_TRY_IMPL(expr, ##__VA_ARGS__, NULL, 0)
69*8617a60dSAndroid Build Coastguard Worker
70*8617a60dSAndroid Build Coastguard Worker /**
71*8617a60dSAndroid Build Coastguard Worker * Check if the return value is an error.
72*8617a60dSAndroid Build Coastguard Worker *
73*8617a60dSAndroid Build Coastguard Worker * @param rv The return value.
74*8617a60dSAndroid Build Coastguard Worker * @return True if the value is an error.
75*8617a60dSAndroid Build Coastguard Worker */
vb2_is_error(vb2_error_t rv)76*8617a60dSAndroid Build Coastguard Worker static inline int vb2_is_error(vb2_error_t rv)
77*8617a60dSAndroid Build Coastguard Worker {
78*8617a60dSAndroid Build Coastguard Worker return rv >= VB2_ERROR_BASE && rv <= VB2_ERROR_MAX;
79*8617a60dSAndroid Build Coastguard Worker }
80*8617a60dSAndroid Build Coastguard Worker
81*8617a60dSAndroid Build Coastguard Worker /* Resource index for vb2ex_read_resource() */
82*8617a60dSAndroid Build Coastguard Worker enum vb2_resource_index {
83*8617a60dSAndroid Build Coastguard Worker
84*8617a60dSAndroid Build Coastguard Worker /* Google binary block */
85*8617a60dSAndroid Build Coastguard Worker VB2_RES_GBB,
86*8617a60dSAndroid Build Coastguard Worker
87*8617a60dSAndroid Build Coastguard Worker /*
88*8617a60dSAndroid Build Coastguard Worker * Firmware verified boot block (keyblock+preamble). Use
89*8617a60dSAndroid Build Coastguard Worker * VB2_CONTEXT_FW_SLOT_B to determine whether this refers to slot A or
90*8617a60dSAndroid Build Coastguard Worker * slot B; vboot will set that flag to the proper state before reading
91*8617a60dSAndroid Build Coastguard Worker * the vblock.
92*8617a60dSAndroid Build Coastguard Worker */
93*8617a60dSAndroid Build Coastguard Worker VB2_RES_FW_VBLOCK,
94*8617a60dSAndroid Build Coastguard Worker
95*8617a60dSAndroid Build Coastguard Worker /*
96*8617a60dSAndroid Build Coastguard Worker * Kernel verified boot block (keyblock+preamble) for the current
97*8617a60dSAndroid Build Coastguard Worker * kernel partition. Used only by vb2api_kernel_load_vblock().
98*8617a60dSAndroid Build Coastguard Worker * Contents are allowed to change between calls to that function (to
99*8617a60dSAndroid Build Coastguard Worker * allow multiple kernels to be examined).
100*8617a60dSAndroid Build Coastguard Worker */
101*8617a60dSAndroid Build Coastguard Worker VB2_RES_KERNEL_VBLOCK,
102*8617a60dSAndroid Build Coastguard Worker };
103*8617a60dSAndroid Build Coastguard Worker
104*8617a60dSAndroid Build Coastguard Worker /* Digest ID for vbapi_get_pcr_digest() */
105*8617a60dSAndroid Build Coastguard Worker enum vb2_pcr_digest {
106*8617a60dSAndroid Build Coastguard Worker /* Digest based on current developer and recovery mode flags */
107*8617a60dSAndroid Build Coastguard Worker BOOT_MODE_PCR,
108*8617a60dSAndroid Build Coastguard Worker
109*8617a60dSAndroid Build Coastguard Worker /* SHA-256 hash digest of HWID, from GBB */
110*8617a60dSAndroid Build Coastguard Worker HWID_DIGEST_PCR,
111*8617a60dSAndroid Build Coastguard Worker
112*8617a60dSAndroid Build Coastguard Worker /* The firmware version values. */
113*8617a60dSAndroid Build Coastguard Worker FIRMWARE_VERSION_PCR,
114*8617a60dSAndroid Build Coastguard Worker
115*8617a60dSAndroid Build Coastguard Worker /* The kernel version values. */
116*8617a60dSAndroid Build Coastguard Worker KERNEL_VERSION_PCR,
117*8617a60dSAndroid Build Coastguard Worker };
118*8617a60dSAndroid Build Coastguard Worker
119*8617a60dSAndroid Build Coastguard Worker /******************************************************************************
120*8617a60dSAndroid Build Coastguard Worker * APIs provided by verified boot.
121*8617a60dSAndroid Build Coastguard Worker *
122*8617a60dSAndroid Build Coastguard Worker * At a high level, call functions in the order described below. After each
123*8617a60dSAndroid Build Coastguard Worker * call, examine vb2_context.flags to determine whether nvdata or secdata
124*8617a60dSAndroid Build Coastguard Worker * needs to be written.
125*8617a60dSAndroid Build Coastguard Worker *
126*8617a60dSAndroid Build Coastguard Worker * If you need to cause the boot process to fail at any point, call
127*8617a60dSAndroid Build Coastguard Worker * vb2api_fail(). Then check vb2_context.flags to see what data needs to be
128*8617a60dSAndroid Build Coastguard Worker * written. Then reboot.
129*8617a60dSAndroid Build Coastguard Worker *
130*8617a60dSAndroid Build Coastguard Worker * Load nvdata from wherever you keep it.
131*8617a60dSAndroid Build Coastguard Worker *
132*8617a60dSAndroid Build Coastguard Worker * Load secdata_firmware from wherever you keep it.
133*8617a60dSAndroid Build Coastguard Worker *
134*8617a60dSAndroid Build Coastguard Worker * If it wasn't there at all (for example, this is the first boot
135*8617a60dSAndroid Build Coastguard Worker * of a new system in the factory), call
136*8617a60dSAndroid Build Coastguard Worker * vb2api_secdata_firmware_create() to initialize the data.
137*8617a60dSAndroid Build Coastguard Worker *
138*8617a60dSAndroid Build Coastguard Worker * If access to your storage is unreliable (reads/writes may
139*8617a60dSAndroid Build Coastguard Worker * contain corrupt data), you may call
140*8617a60dSAndroid Build Coastguard Worker * vb2api_secdata_firmware_check() to determine if the data was
141*8617a60dSAndroid Build Coastguard Worker * valid, and retry reading if it wasn't. (In that case, you
142*8617a60dSAndroid Build Coastguard Worker * should also read back and check the data after any time you
143*8617a60dSAndroid Build Coastguard Worker * write it, to make sure it was written correctly.)
144*8617a60dSAndroid Build Coastguard Worker *
145*8617a60dSAndroid Build Coastguard Worker * Call vb2api_fw_phase1(). At present, this nominally decides whether
146*8617a60dSAndroid Build Coastguard Worker * recovery mode is needed this boot.
147*8617a60dSAndroid Build Coastguard Worker *
148*8617a60dSAndroid Build Coastguard Worker * Call vb2api_fw_phase2(). At present, this nominally decides which
149*8617a60dSAndroid Build Coastguard Worker * firmware slot will be attempted (A or B).
150*8617a60dSAndroid Build Coastguard Worker *
151*8617a60dSAndroid Build Coastguard Worker * Call vb2api_fw_phase3(). At present, this nominally verifies the
152*8617a60dSAndroid Build Coastguard Worker * firmware keyblock and preamble.
153*8617a60dSAndroid Build Coastguard Worker *
154*8617a60dSAndroid Build Coastguard Worker * Lock down wherever you keep secdata_firmware. It should no longer be
155*8617a60dSAndroid Build Coastguard Worker * writable this boot.
156*8617a60dSAndroid Build Coastguard Worker *
157*8617a60dSAndroid Build Coastguard Worker * Verify the hash of each section of code/data you need to boot the RW
158*8617a60dSAndroid Build Coastguard Worker * firmware. For each section:
159*8617a60dSAndroid Build Coastguard Worker *
160*8617a60dSAndroid Build Coastguard Worker * 1) Normal verification:
161*8617a60dSAndroid Build Coastguard Worker *
162*8617a60dSAndroid Build Coastguard Worker * Call vb2api_init_hash() to see if the hash exists.
163*8617a60dSAndroid Build Coastguard Worker *
164*8617a60dSAndroid Build Coastguard Worker * Load the data for the section. Call vb2api_extend_hash() on the
165*8617a60dSAndroid Build Coastguard Worker * data as you load it. You can load it all at once and make one
166*8617a60dSAndroid Build Coastguard Worker * call, or load and hash-extend a block at a time.
167*8617a60dSAndroid Build Coastguard Worker *
168*8617a60dSAndroid Build Coastguard Worker * Call vb2api_check_hash() to see if the hash is valid.
169*8617a60dSAndroid Build Coastguard Worker *
170*8617a60dSAndroid Build Coastguard Worker * If it is valid, you may use the data and/or execute
171*8617a60dSAndroid Build Coastguard Worker * code from that section.
172*8617a60dSAndroid Build Coastguard Worker *
173*8617a60dSAndroid Build Coastguard Worker * If the hash was invalid, you must reboot.
174*8617a60dSAndroid Build Coastguard Worker *
175*8617a60dSAndroid Build Coastguard Worker * 2) Verification with CBFS integration:
176*8617a60dSAndroid Build Coastguard Worker *
177*8617a60dSAndroid Build Coastguard Worker * Call vb2api_get_metadata_hash() to get hash of CBFS metadata.
178*8617a60dSAndroid Build Coastguard Worker *
179*8617a60dSAndroid Build Coastguard Worker * Initialize CBFS using stored hash as correct metadata hash.
180*8617a60dSAndroid Build Coastguard Worker *
181*8617a60dSAndroid Build Coastguard Worker * If CBFS initialization fails because of metadata hash
182*8617a60dSAndroid Build Coastguard Worker * mismatch, you must reboot.
183*8617a60dSAndroid Build Coastguard Worker *
184*8617a60dSAndroid Build Coastguard Worker * If CBFS initialization succeeds, you may use the data
185*8617a60dSAndroid Build Coastguard Worker * and/or execute code from that section.
186*8617a60dSAndroid Build Coastguard Worker * IMPORTANT: Be aware, that to have full section
187*8617a60dSAndroid Build Coastguard Worker * verification, the CBFS_VERIFICATION has to be enabled.
188*8617a60dSAndroid Build Coastguard Worker * Initialization of CBFS volume only checks hash of files
189*8617a60dSAndroid Build Coastguard Worker * metadata, not their contents!
190*8617a60dSAndroid Build Coastguard Worker *
191*8617a60dSAndroid Build Coastguard Worker * At this point, firmware verification is done, and vb2_context contains the
192*8617a60dSAndroid Build Coastguard Worker * kernel key needed to verify the kernel. That context should be preserved
193*8617a60dSAndroid Build Coastguard Worker * and passed on to kernel selection. The kernel selection process may be
194*8617a60dSAndroid Build Coastguard Worker * done by the same firmware image, or may be done by the RW firmware. The
195*8617a60dSAndroid Build Coastguard Worker * recommended order is:
196*8617a60dSAndroid Build Coastguard Worker *
197*8617a60dSAndroid Build Coastguard Worker * Load secdata_kernel from wherever you keep it.
198*8617a60dSAndroid Build Coastguard Worker *
199*8617a60dSAndroid Build Coastguard Worker * If it wasn't there at all (for example, this is the first boot
200*8617a60dSAndroid Build Coastguard Worker * of a new system in the factory), call
201*8617a60dSAndroid Build Coastguard Worker * vb2api_secdata_kernel_create() to initialize the data.
202*8617a60dSAndroid Build Coastguard Worker *
203*8617a60dSAndroid Build Coastguard Worker * If access to your storage is unreliable (reads/writes may
204*8617a60dSAndroid Build Coastguard Worker * contain corrupt data), you may call
205*8617a60dSAndroid Build Coastguard Worker * vb2api_secdata_kernel_check() to determine if the data was
206*8617a60dSAndroid Build Coastguard Worker * valid, and retry reading if it wasn't. (In that case, you
207*8617a60dSAndroid Build Coastguard Worker * should also read back and check the data after any time you
208*8617a60dSAndroid Build Coastguard Worker * write it, to make sure it was written correctly.)
209*8617a60dSAndroid Build Coastguard Worker *
210*8617a60dSAndroid Build Coastguard Worker * Call vb2api_kernel_phase1(). At present, this decides which key to
211*8617a60dSAndroid Build Coastguard Worker * use to verify kernel data - the recovery key from the GBB, or the
212*8617a60dSAndroid Build Coastguard Worker * kernel subkey from the firmware verification stage.
213*8617a60dSAndroid Build Coastguard Worker *
214*8617a60dSAndroid Build Coastguard Worker * Call vb2api_kernel_phase2(). Do EC and auxfw software sync, clear
215*8617a60dSAndroid Build Coastguard Worker * recovery and commit nvdata if needed.
216*8617a60dSAndroid Build Coastguard Worker *
217*8617a60dSAndroid Build Coastguard Worker * Find a boot device (you're on your own here).
218*8617a60dSAndroid Build Coastguard Worker *
219*8617a60dSAndroid Build Coastguard Worker * Call vb2api_load_kernel_vblock() for each kernel partition on the
220*8617a60dSAndroid Build Coastguard Worker * boot device, until one succeeds.
221*8617a60dSAndroid Build Coastguard Worker *
222*8617a60dSAndroid Build Coastguard Worker * When that succeeds, call vb2api_get_kernel_size() to determine where
223*8617a60dSAndroid Build Coastguard Worker * the kernel is located in the stream and how big it is. Load or map
224*8617a60dSAndroid Build Coastguard Worker * the kernel. (Again, you're on your own. This is the responsibility of
225*8617a60dSAndroid Build Coastguard Worker * the caller so that the caller can choose whether to allocate a buffer,
226*8617a60dSAndroid Build Coastguard Worker * load the kernel data into a predefined area of RAM, or directly map a
227*8617a60dSAndroid Build Coastguard Worker * kernel file into the address space. Note that technically it doesn't
228*8617a60dSAndroid Build Coastguard Worker * matter whether the kernel data is even in the same file or stream as
229*8617a60dSAndroid Build Coastguard Worker * the vblock, as long as the caller loads the right data.
230*8617a60dSAndroid Build Coastguard Worker *
231*8617a60dSAndroid Build Coastguard Worker * Call vb2api_verify_kernel_data() on the kernel data.
232*8617a60dSAndroid Build Coastguard Worker *
233*8617a60dSAndroid Build Coastguard Worker * If you ran out of kernels before finding a good one, call vb2api_fail()
234*8617a60dSAndroid Build Coastguard Worker * with an appropriate recovery reason.
235*8617a60dSAndroid Build Coastguard Worker *
236*8617a60dSAndroid Build Coastguard Worker * Set the VB2_CONTEXT_ALLOW_KERNEL_ROLL_FORWARD flag if the current
237*8617a60dSAndroid Build Coastguard Worker * kernel partition has the successful flag (that is, it's already known
238*8617a60dSAndroid Build Coastguard Worker * or assumed to be a functional kernel partition).
239*8617a60dSAndroid Build Coastguard Worker *
240*8617a60dSAndroid Build Coastguard Worker * Call vb2api_kernel_phase3(). This cleans up from kernel verification
241*8617a60dSAndroid Build Coastguard Worker * and updates the secure data if needed.
242*8617a60dSAndroid Build Coastguard Worker *
243*8617a60dSAndroid Build Coastguard Worker * Lock down wherever you keep secdata_kernel. It should no longer be
244*8617a60dSAndroid Build Coastguard Worker * writable this boot.
245*8617a60dSAndroid Build Coastguard Worker */
246*8617a60dSAndroid Build Coastguard Worker
247*8617a60dSAndroid Build Coastguard Worker /**
248*8617a60dSAndroid Build Coastguard Worker * Initialize verified boot data structures.
249*8617a60dSAndroid Build Coastguard Worker *
250*8617a60dSAndroid Build Coastguard Worker * Needs to be called once per boot, before using any API functions that
251*8617a60dSAndroid Build Coastguard Worker * accept a vb2_context object. Sets up the vboot work buffer, as well as
252*8617a60dSAndroid Build Coastguard Worker * vb2_shared_data and vb2_context. A pointer to the context object is
253*8617a60dSAndroid Build Coastguard Worker * written to ctxptr. After transitioning between different firmware
254*8617a60dSAndroid Build Coastguard Worker * applications, or any time the context pointer is lost, vb2api_reinit()
255*8617a60dSAndroid Build Coastguard Worker * should be used to restore access to the context and data on the workbuf.
256*8617a60dSAndroid Build Coastguard Worker *
257*8617a60dSAndroid Build Coastguard Worker * If the workbuf needs to be relocated, call vb2api_relocate() instead
258*8617a60dSAndroid Build Coastguard Worker * of copying memory manually.
259*8617a60dSAndroid Build Coastguard Worker *
260*8617a60dSAndroid Build Coastguard Worker * @param workbuf Workbuf memory location to initialize
261*8617a60dSAndroid Build Coastguard Worker * @param size Size of workbuf being initialized
262*8617a60dSAndroid Build Coastguard Worker * @param ctxptr Pointer to a context pointer to be filled in
263*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
264*8617a60dSAndroid Build Coastguard Worker */
265*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_init(void *workbuf, uint32_t size,
266*8617a60dSAndroid Build Coastguard Worker struct vb2_context **ctxptr);
267*8617a60dSAndroid Build Coastguard Worker
268*8617a60dSAndroid Build Coastguard Worker /**
269*8617a60dSAndroid Build Coastguard Worker * Reinitialize vboot data structures.
270*8617a60dSAndroid Build Coastguard Worker *
271*8617a60dSAndroid Build Coastguard Worker * After transitioning between different firmware applications, or any time the
272*8617a60dSAndroid Build Coastguard Worker * context pointer is lost, this function should be called to restore access to
273*8617a60dSAndroid Build Coastguard Worker * the workbuf. A pointer to the context object is written to ctxptr. Returns
274*8617a60dSAndroid Build Coastguard Worker * an error if the vboot work buffer is inconsistent.
275*8617a60dSAndroid Build Coastguard Worker *
276*8617a60dSAndroid Build Coastguard Worker * If the workbuf needs to be relocated, call vb2api_relocate() instead
277*8617a60dSAndroid Build Coastguard Worker * of copying memory manually.
278*8617a60dSAndroid Build Coastguard Worker *
279*8617a60dSAndroid Build Coastguard Worker * @param workbuf Workbuf memory location to check
280*8617a60dSAndroid Build Coastguard Worker * @param ctxptr Pointer to a context pointer to be filled in
281*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
282*8617a60dSAndroid Build Coastguard Worker */
283*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_reinit(void *workbuf, struct vb2_context **ctxptr);
284*8617a60dSAndroid Build Coastguard Worker
285*8617a60dSAndroid Build Coastguard Worker /**
286*8617a60dSAndroid Build Coastguard Worker * Relocate vboot data structures.
287*8617a60dSAndroid Build Coastguard Worker *
288*8617a60dSAndroid Build Coastguard Worker * Move the vboot work buffer from one memory location to another, and expand
289*8617a60dSAndroid Build Coastguard Worker * or contract the workbuf to fit. The target memory location may be the same
290*8617a60dSAndroid Build Coastguard Worker * as the original (used for a "resize" operation), and it is safe to call this
291*8617a60dSAndroid Build Coastguard Worker * function with overlapping memory regions.
292*8617a60dSAndroid Build Coastguard Worker *
293*8617a60dSAndroid Build Coastguard Worker * A pointer to the context object is written to ctxptr. Returns an error if
294*8617a60dSAndroid Build Coastguard Worker * the vboot work buffer is inconsistent, or if the new memory space is too
295*8617a60dSAndroid Build Coastguard Worker * small to contain the work buffer.
296*8617a60dSAndroid Build Coastguard Worker *
297*8617a60dSAndroid Build Coastguard Worker * @param new_workbuf Target workbuf memory location
298*8617a60dSAndroid Build Coastguard Worker * @param cur_workbuf Original workbuf memory location to relocate
299*8617a60dSAndroid Build Coastguard Worker * @param size Target size of relocated workbuf
300*8617a60dSAndroid Build Coastguard Worker * @param ctxptr Pointer to a context pointer to be filled in
301*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
302*8617a60dSAndroid Build Coastguard Worker */
303*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_relocate(void *new_workbuf, const void *cur_workbuf,
304*8617a60dSAndroid Build Coastguard Worker uint32_t size, struct vb2_context **ctxptr);
305*8617a60dSAndroid Build Coastguard Worker
306*8617a60dSAndroid Build Coastguard Worker /**
307*8617a60dSAndroid Build Coastguard Worker * Export "VBSD" vboot1 data structure.
308*8617a60dSAndroid Build Coastguard Worker *
309*8617a60dSAndroid Build Coastguard Worker * Copy relevant fields from vboot2 data structures to VbSharedDataHeader
310*8617a60dSAndroid Build Coastguard Worker * format. Takes a pointer to the memory space to be filled in. Expects
311*8617a60dSAndroid Build Coastguard Worker * the memory available to be of size VB2_VBSD_SIZE.
312*8617a60dSAndroid Build Coastguard Worker *
313*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
314*8617a60dSAndroid Build Coastguard Worker * @param dest Target memory to store VbSharedDataHeader
315*8617a60dSAndroid Build Coastguard Worker */
316*8617a60dSAndroid Build Coastguard Worker void vb2api_export_vbsd(struct vb2_context *ctx, void *dest);
317*8617a60dSAndroid Build Coastguard Worker
318*8617a60dSAndroid Build Coastguard Worker /**
319*8617a60dSAndroid Build Coastguard Worker * Check the validity of firmware secure storage context.
320*8617a60dSAndroid Build Coastguard Worker *
321*8617a60dSAndroid Build Coastguard Worker * Checks version and CRC.
322*8617a60dSAndroid Build Coastguard Worker *
323*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
324*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code if error.
325*8617a60dSAndroid Build Coastguard Worker */
326*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_secdata_firmware_check(struct vb2_context *ctx);
327*8617a60dSAndroid Build Coastguard Worker
328*8617a60dSAndroid Build Coastguard Worker /**
329*8617a60dSAndroid Build Coastguard Worker * Create fresh data in firmware secure storage context.
330*8617a60dSAndroid Build Coastguard Worker *
331*8617a60dSAndroid Build Coastguard Worker * Use this only when initializing the secure storage context on a new machine
332*8617a60dSAndroid Build Coastguard Worker * the first time it boots. Do NOT simply use this if
333*8617a60dSAndroid Build Coastguard Worker * vb2api_secdata_firmware_check() (or any other API in this library) fails;
334*8617a60dSAndroid Build Coastguard Worker * that could allow the secure data to be rolled back to an insecure state.
335*8617a60dSAndroid Build Coastguard Worker *
336*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
337*8617a60dSAndroid Build Coastguard Worker * @return size of created firmware secure storage data in bytes
338*8617a60dSAndroid Build Coastguard Worker */
339*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_secdata_firmware_create(struct vb2_context *ctx);
340*8617a60dSAndroid Build Coastguard Worker
341*8617a60dSAndroid Build Coastguard Worker /**
342*8617a60dSAndroid Build Coastguard Worker * Check the validity of kernel secure storage context (ctx->secdata_kernel).
343*8617a60dSAndroid Build Coastguard Worker *
344*8617a60dSAndroid Build Coastguard Worker * Checks version, UID, and CRC.
345*8617a60dSAndroid Build Coastguard Worker *
346*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
347*8617a60dSAndroid Build Coastguard Worker * @param size (IN) Size of data to be checked
348*8617a60dSAndroid Build Coastguard Worker * (OUT) Expected size of data
349*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code if error. If data is missing,
350*8617a60dSAndroid Build Coastguard Worker * it returns VB2_ERROR_SECDATA_KERNEL_INCOMPLETE and informs the caller
351*8617a60dSAndroid Build Coastguard Worker * of the expected size.
352*8617a60dSAndroid Build Coastguard Worker */
353*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_secdata_kernel_check(struct vb2_context *ctx, uint8_t *size);
354*8617a60dSAndroid Build Coastguard Worker
355*8617a60dSAndroid Build Coastguard Worker /**
356*8617a60dSAndroid Build Coastguard Worker * Create fresh data in kernel secure storage context.
357*8617a60dSAndroid Build Coastguard Worker *
358*8617a60dSAndroid Build Coastguard Worker * Use this only when initializing the secure storage context on a new machine
359*8617a60dSAndroid Build Coastguard Worker * the first time it boots. Do NOT simply use this if
360*8617a60dSAndroid Build Coastguard Worker * vb2api_secdata_kernel_check() (or any other API in this library) fails; that
361*8617a60dSAndroid Build Coastguard Worker * could allow the secure data to be rolled back to an insecure state.
362*8617a60dSAndroid Build Coastguard Worker *
363*8617a60dSAndroid Build Coastguard Worker * vb2api_secdata_kernel_create always creates secdata kernel using the latest
364*8617a60dSAndroid Build Coastguard Worker * revision.
365*8617a60dSAndroid Build Coastguard Worker *
366*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
367*8617a60dSAndroid Build Coastguard Worker * @return size of created kernel secure storage data in bytes
368*8617a60dSAndroid Build Coastguard Worker */
369*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_secdata_kernel_create(struct vb2_context *ctx);
370*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_secdata_kernel_create_v0(struct vb2_context *ctx);
371*8617a60dSAndroid Build Coastguard Worker
372*8617a60dSAndroid Build Coastguard Worker /**
373*8617a60dSAndroid Build Coastguard Worker * Create an empty Firmware Management Parameters (FWMP) in secure storage
374*8617a60dSAndroid Build Coastguard Worker * context.
375*8617a60dSAndroid Build Coastguard Worker *
376*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
377*8617a60dSAndroid Build Coastguard Worker * @return size of created FWMP secure storage data in bytes
378*8617a60dSAndroid Build Coastguard Worker */
379*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_secdata_fwmp_create(struct vb2_context *ctx);
380*8617a60dSAndroid Build Coastguard Worker
381*8617a60dSAndroid Build Coastguard Worker /**
382*8617a60dSAndroid Build Coastguard Worker * Check the validity of firmware management parameters (FWMP) space.
383*8617a60dSAndroid Build Coastguard Worker *
384*8617a60dSAndroid Build Coastguard Worker * Checks size, version, and CRC. If the struct size is larger than the size
385*8617a60dSAndroid Build Coastguard Worker * passed in, the size pointer is set to the expected full size of the struct,
386*8617a60dSAndroid Build Coastguard Worker * and VB2_ERROR_SECDATA_FWMP_INCOMPLETE is returned. The caller should
387*8617a60dSAndroid Build Coastguard Worker * re-read the returned number of bytes, and call this function again.
388*8617a60dSAndroid Build Coastguard Worker *
389*8617a60dSAndroid Build Coastguard Worker * @param ctx Context pointer
390*8617a60dSAndroid Build Coastguard Worker * @param size Amount of struct which has been read
391*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code if error.
392*8617a60dSAndroid Build Coastguard Worker */
393*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_secdata_fwmp_check(struct vb2_context *ctx, uint8_t *size);
394*8617a60dSAndroid Build Coastguard Worker
395*8617a60dSAndroid Build Coastguard Worker /**
396*8617a60dSAndroid Build Coastguard Worker * Report firmware failure to vboot.
397*8617a60dSAndroid Build Coastguard Worker *
398*8617a60dSAndroid Build Coastguard Worker * If the failure occurred after choosing a firmware slot, and the other
399*8617a60dSAndroid Build Coastguard Worker * firmware slot is not known-bad, try the other firmware slot after reboot.
400*8617a60dSAndroid Build Coastguard Worker *
401*8617a60dSAndroid Build Coastguard Worker * If the failure occurred before choosing a firmware slot, or both slots have
402*8617a60dSAndroid Build Coastguard Worker * failed in successive boots, request recovery.
403*8617a60dSAndroid Build Coastguard Worker *
404*8617a60dSAndroid Build Coastguard Worker * This may be called before vb2api_phase1() to indicate errors in the boot
405*8617a60dSAndroid Build Coastguard Worker * process prior to the start of vboot. On return, the calling firmware should
406*8617a60dSAndroid Build Coastguard Worker * check for updates to secdata and/or nvdata, then reboot.
407*8617a60dSAndroid Build Coastguard Worker *
408*8617a60dSAndroid Build Coastguard Worker * @param reason Recovery reason
409*8617a60dSAndroid Build Coastguard Worker * @param subcode Recovery subcode
410*8617a60dSAndroid Build Coastguard Worker */
411*8617a60dSAndroid Build Coastguard Worker void vb2api_fail(struct vb2_context *ctx, uint8_t reason, uint8_t subcode);
412*8617a60dSAndroid Build Coastguard Worker
413*8617a60dSAndroid Build Coastguard Worker /**
414*8617a60dSAndroid Build Coastguard Worker * Report firmware failure from previous boot to vboot.
415*8617a60dSAndroid Build Coastguard Worker *
416*8617a60dSAndroid Build Coastguard Worker * This function can only be called before vb2api_fw_phase1 (nvdata is
417*8617a60dSAndroid Build Coastguard Worker * initialized). Otherwise an assert is raised. This function is required to be
418*8617a60dSAndroid Build Coastguard Worker * called in the following environment:
419*8617a60dSAndroid Build Coastguard Worker * - Context has to be initialized using vb2api_init
420*8617a60dSAndroid Build Coastguard Worker * - NV data has to be read into context
421*8617a60dSAndroid Build Coastguard Worker * - Secdata may or may not have been read
422*8617a60dSAndroid Build Coastguard Worker * - vb2api_fw_phase1 must not have been called.
423*8617a60dSAndroid Build Coastguard Worker *
424*8617a60dSAndroid Build Coastguard Worker * If the other slot is not known bad then try the other firmware slot.
425*8617a60dSAndroid Build Coastguard Worker * If both the slots are known bad, then request recovery.
426*8617a60dSAndroid Build Coastguard Worker *
427*8617a60dSAndroid Build Coastguard Worker * @param reason Recovery reason
428*8617a60dSAndroid Build Coastguard Worker * @param subcode Recovery subcode
429*8617a60dSAndroid Build Coastguard Worker */
430*8617a60dSAndroid Build Coastguard Worker void vb2api_previous_boot_fail(struct vb2_context *ctx,
431*8617a60dSAndroid Build Coastguard Worker uint8_t reason, uint8_t subcode);
432*8617a60dSAndroid Build Coastguard Worker
433*8617a60dSAndroid Build Coastguard Worker /**
434*8617a60dSAndroid Build Coastguard Worker * Entry point for setting up a context that can only load and verify a kernel.
435*8617a60dSAndroid Build Coastguard Worker *
436*8617a60dSAndroid Build Coastguard Worker * The only allowed usage is to call vb2api_init, then this entry point,
437*8617a60dSAndroid Build Coastguard Worker * then vb2api_load_kernel.
438*8617a60dSAndroid Build Coastguard Worker *
439*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
440*8617a60dSAndroid Build Coastguard Worker * @param kernel_packed_key_data Packed public key for kernel
441*8617a60dSAndroid Build Coastguard Worker * verification
442*8617a60dSAndroid Build Coastguard Worker * @param kernel_packed_key_data_size Size in bytes of kernel_packed_key_data
443*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
444*8617a60dSAndroid Build Coastguard Worker */
445*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_inject_kernel_subkey(struct vb2_context *ctx,
446*8617a60dSAndroid Build Coastguard Worker const uint8_t *kernel_packed_key_data,
447*8617a60dSAndroid Build Coastguard Worker uint32_t kernel_packed_key_data_size);
448*8617a60dSAndroid Build Coastguard Worker
449*8617a60dSAndroid Build Coastguard Worker /**
450*8617a60dSAndroid Build Coastguard Worker * Firmware selection, phase 1.
451*8617a60dSAndroid Build Coastguard Worker *
452*8617a60dSAndroid Build Coastguard Worker * If the returned error is VB2_ERROR_API_PHASE1_RECOVERY, the calling firmware
453*8617a60dSAndroid Build Coastguard Worker * should jump directly to recovery-mode firmware without rebooting.
454*8617a60dSAndroid Build Coastguard Worker *
455*8617a60dSAndroid Build Coastguard Worker * For other errors, the calling firmware should check for updates to secdata
456*8617a60dSAndroid Build Coastguard Worker * and/or nvdata, then reboot.
457*8617a60dSAndroid Build Coastguard Worker *
458*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
459*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
460*8617a60dSAndroid Build Coastguard Worker */
461*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_fw_phase1(struct vb2_context *ctx);
462*8617a60dSAndroid Build Coastguard Worker
463*8617a60dSAndroid Build Coastguard Worker /**
464*8617a60dSAndroid Build Coastguard Worker * Firmware selection, phase 2.
465*8617a60dSAndroid Build Coastguard Worker *
466*8617a60dSAndroid Build Coastguard Worker * On error, the calling firmware should check for updates to secdata and/or
467*8617a60dSAndroid Build Coastguard Worker * nvdata, then reboot.
468*8617a60dSAndroid Build Coastguard Worker *
469*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
470*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
471*8617a60dSAndroid Build Coastguard Worker */
472*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_fw_phase2(struct vb2_context *ctx);
473*8617a60dSAndroid Build Coastguard Worker
474*8617a60dSAndroid Build Coastguard Worker /**
475*8617a60dSAndroid Build Coastguard Worker * Firmware selection, phase 3.
476*8617a60dSAndroid Build Coastguard Worker *
477*8617a60dSAndroid Build Coastguard Worker * On error, the calling firmware should check for updates to secdata and/or
478*8617a60dSAndroid Build Coastguard Worker * nvdata, then reboot.
479*8617a60dSAndroid Build Coastguard Worker *
480*8617a60dSAndroid Build Coastguard Worker * On success, the calling firmware should lock down secdata before continuing
481*8617a60dSAndroid Build Coastguard Worker * with the boot process.
482*8617a60dSAndroid Build Coastguard Worker *
483*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
484*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
485*8617a60dSAndroid Build Coastguard Worker */
486*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_fw_phase3(struct vb2_context *ctx);
487*8617a60dSAndroid Build Coastguard Worker
488*8617a60dSAndroid Build Coastguard Worker /**
489*8617a60dSAndroid Build Coastguard Worker * Initialize hashing data for the specified tag.
490*8617a60dSAndroid Build Coastguard Worker * This function is not legal when running from a coreboot image that has
491*8617a60dSAndroid Build Coastguard Worker * CONFIG_VBOOT_CBFS_INTEGRATION=y set. In that case, vb2api_get_metadata_hash()
492*8617a60dSAndroid Build Coastguard Worker * must be used instead.
493*8617a60dSAndroid Build Coastguard Worker *
494*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
495*8617a60dSAndroid Build Coastguard Worker * @param tag Tag to start hashing (enum vb2_hash_tag)
496*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
497*8617a60dSAndroid Build Coastguard Worker */
498*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_init_hash(struct vb2_context *ctx, uint32_t tag);
499*8617a60dSAndroid Build Coastguard Worker
500*8617a60dSAndroid Build Coastguard Worker /**
501*8617a60dSAndroid Build Coastguard Worker * Extend the hash started by vb2api_init_hash() with additional data.
502*8617a60dSAndroid Build Coastguard Worker *
503*8617a60dSAndroid Build Coastguard Worker * (This is the same for both old and new style structs.)
504*8617a60dSAndroid Build Coastguard Worker *
505*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
506*8617a60dSAndroid Build Coastguard Worker * @param buf Data to hash
507*8617a60dSAndroid Build Coastguard Worker * @param size Size of data in bytes
508*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
509*8617a60dSAndroid Build Coastguard Worker */
510*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_extend_hash(struct vb2_context *ctx, const void *buf,
511*8617a60dSAndroid Build Coastguard Worker uint32_t size);
512*8617a60dSAndroid Build Coastguard Worker
513*8617a60dSAndroid Build Coastguard Worker /**
514*8617a60dSAndroid Build Coastguard Worker * Check the hash value started by vb2api_init_hash().
515*8617a60dSAndroid Build Coastguard Worker *
516*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
517*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
518*8617a60dSAndroid Build Coastguard Worker */
519*8617a60dSAndroid Build Coastguard Worker int vb2api_check_hash(struct vb2_context *ctx);
520*8617a60dSAndroid Build Coastguard Worker
521*8617a60dSAndroid Build Coastguard Worker /**
522*8617a60dSAndroid Build Coastguard Worker * Check the hash value started by vb2api_init_hash() while retrieving
523*8617a60dSAndroid Build Coastguard Worker * calculated digest.
524*8617a60dSAndroid Build Coastguard Worker *
525*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
526*8617a60dSAndroid Build Coastguard Worker * @param digest_out optional pointer to buffer to store digest
527*8617a60dSAndroid Build Coastguard Worker * @param digest_out_size optional size of buffer to store digest
528*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
529*8617a60dSAndroid Build Coastguard Worker */
530*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_check_hash_get_digest(struct vb2_context *ctx,
531*8617a60dSAndroid Build Coastguard Worker void *digest_out,
532*8617a60dSAndroid Build Coastguard Worker uint32_t digest_out_size);
533*8617a60dSAndroid Build Coastguard Worker
534*8617a60dSAndroid Build Coastguard Worker /**
535*8617a60dSAndroid Build Coastguard Worker * Get pointer to metadata hash from body signature in preamble.
536*8617a60dSAndroid Build Coastguard Worker * Body signature data size has to be zero to indicate that it contains
537*8617a60dSAndroid Build Coastguard Worker * metadata hash. This is only legal to call after vb2api_fw_phase3() has
538*8617a60dSAndroid Build Coastguard Worker * returned successfully, and will return with error otherwise.
539*8617a60dSAndroid Build Coastguard Worker * This function is only legal to call from coreboot with
540*8617a60dSAndroid Build Coastguard Worker * CONFIG_VBOOT_CBFS_INTEGRATION=y. `futility sign` will automatically detect
541*8617a60dSAndroid Build Coastguard Worker * the presence of that option in an image and prepare the correct kind
542*8617a60dSAndroid Build Coastguard Worker * of signature.
543*8617a60dSAndroid Build Coastguard Worker *
544*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
545*8617a60dSAndroid Build Coastguard Worker * @param hash_ptr_out pointer to output hash to
546*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
547*8617a60dSAndroid Build Coastguard Worker */
548*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_get_metadata_hash(struct vb2_context *ctx,
549*8617a60dSAndroid Build Coastguard Worker struct vb2_hash **hash_ptr_out);
550*8617a60dSAndroid Build Coastguard Worker
551*8617a60dSAndroid Build Coastguard Worker /**
552*8617a60dSAndroid Build Coastguard Worker * Get a PCR digest
553*8617a60dSAndroid Build Coastguard Worker *
554*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
555*8617a60dSAndroid Build Coastguard Worker * @param which_digest PCR index of the digest
556*8617a60dSAndroid Build Coastguard Worker * @param dest Destination where the digest is copied.
557*8617a60dSAndroid Build Coastguard Worker * Recommended size is VB2_PCR_DIGEST_RECOMMENDED_SIZE.
558*8617a60dSAndroid Build Coastguard Worker * @param dest_size IN: size of the buffer pointed by dest
559*8617a60dSAndroid Build Coastguard Worker * OUT: size of the copied digest
560*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error
561*8617a60dSAndroid Build Coastguard Worker */
562*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_get_pcr_digest(struct vb2_context *ctx,
563*8617a60dSAndroid Build Coastguard Worker enum vb2_pcr_digest which_digest,
564*8617a60dSAndroid Build Coastguard Worker uint8_t *dest, uint32_t *dest_size);
565*8617a60dSAndroid Build Coastguard Worker
566*8617a60dSAndroid Build Coastguard Worker /**
567*8617a60dSAndroid Build Coastguard Worker * Prepare for kernel verification stage.
568*8617a60dSAndroid Build Coastguard Worker *
569*8617a60dSAndroid Build Coastguard Worker * Must be called before other vb2api kernel functions.
570*8617a60dSAndroid Build Coastguard Worker *
571*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
572*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
573*8617a60dSAndroid Build Coastguard Worker */
574*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_kernel_phase1(struct vb2_context *ctx);
575*8617a60dSAndroid Build Coastguard Worker
576*8617a60dSAndroid Build Coastguard Worker /**
577*8617a60dSAndroid Build Coastguard Worker * Do kernel verification.
578*8617a60dSAndroid Build Coastguard Worker *
579*8617a60dSAndroid Build Coastguard Worker * Must be called after vb2api_kernel_phase1.
580*8617a60dSAndroid Build Coastguard Worker *
581*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
582*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
583*8617a60dSAndroid Build Coastguard Worker */
584*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_kernel_phase2(struct vb2_context *ctx);
585*8617a60dSAndroid Build Coastguard Worker
586*8617a60dSAndroid Build Coastguard Worker /**
587*8617a60dSAndroid Build Coastguard Worker * Finalize for kernel verification stage.
588*8617a60dSAndroid Build Coastguard Worker *
589*8617a60dSAndroid Build Coastguard Worker * Handle NO_BOOT flag. Also, check and roll forward kernel version.
590*8617a60dSAndroid Build Coastguard Worker *
591*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
592*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
593*8617a60dSAndroid Build Coastguard Worker */
594*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_kernel_finalize(struct vb2_context *ctx);
595*8617a60dSAndroid Build Coastguard Worker
596*8617a60dSAndroid Build Coastguard Worker struct vb2_kernel_params {
597*8617a60dSAndroid Build Coastguard Worker /* Inputs to vb2api_load_kernel(). */
598*8617a60dSAndroid Build Coastguard Worker /* Destination buffer for kernel (normally at 0x100000 on x86). */
599*8617a60dSAndroid Build Coastguard Worker void *kernel_buffer;
600*8617a60dSAndroid Build Coastguard Worker /* Size of kernel buffer in bytes. */
601*8617a60dSAndroid Build Coastguard Worker uint32_t kernel_buffer_size;
602*8617a60dSAndroid Build Coastguard Worker
603*8617a60dSAndroid Build Coastguard Worker /*
604*8617a60dSAndroid Build Coastguard Worker * Outputs from vb2api_load_kernel(); valid only if it returns success.
605*8617a60dSAndroid Build Coastguard Worker */
606*8617a60dSAndroid Build Coastguard Worker /* Handle of disk containing loaded kernel. */
607*8617a60dSAndroid Build Coastguard Worker vb2ex_disk_handle_t disk_handle;
608*8617a60dSAndroid Build Coastguard Worker /* Partition number on disk to boot (1...M). */
609*8617a60dSAndroid Build Coastguard Worker uint32_t partition_number;
610*8617a60dSAndroid Build Coastguard Worker /* Offset of bootloader image from `kernel_buffer` address. */
611*8617a60dSAndroid Build Coastguard Worker uint64_t bootloader_offset;
612*8617a60dSAndroid Build Coastguard Worker /* Size of bootloader image in bytes. */
613*8617a60dSAndroid Build Coastguard Worker uint32_t bootloader_size;
614*8617a60dSAndroid Build Coastguard Worker /* UniquePartitionGuid for boot partition. */
615*8617a60dSAndroid Build Coastguard Worker uint8_t partition_guid[16];
616*8617a60dSAndroid Build Coastguard Worker /* Flags set by signer. */
617*8617a60dSAndroid Build Coastguard Worker uint32_t flags;
618*8617a60dSAndroid Build Coastguard Worker };
619*8617a60dSAndroid Build Coastguard Worker
620*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
621*8617a60dSAndroid Build Coastguard Worker /* Disk access */
622*8617a60dSAndroid Build Coastguard Worker
623*8617a60dSAndroid Build Coastguard Worker /* Flags for vb2_disk_info */
624*8617a60dSAndroid Build Coastguard Worker
625*8617a60dSAndroid Build Coastguard Worker /*
626*8617a60dSAndroid Build Coastguard Worker * Disk selection in the lower 16 bits (where the disk lives), and disk
627*8617a60dSAndroid Build Coastguard Worker * attributes in the higher 16 bits (extra information about the disk
628*8617a60dSAndroid Build Coastguard Worker * needed to access it correctly).
629*8617a60dSAndroid Build Coastguard Worker */
630*8617a60dSAndroid Build Coastguard Worker #define VB2_DISK_FLAG_SELECT_MASK 0xffff
631*8617a60dSAndroid Build Coastguard Worker #define VB2_DISK_FLAG_ATTRIBUTE_MASK (0xffff << 16)
632*8617a60dSAndroid Build Coastguard Worker
633*8617a60dSAndroid Build Coastguard Worker /*
634*8617a60dSAndroid Build Coastguard Worker * Disks are used in two ways:
635*8617a60dSAndroid Build Coastguard Worker * - As a random-access device to read and write the GPT
636*8617a60dSAndroid Build Coastguard Worker * - As a streaming device to read the kernel
637*8617a60dSAndroid Build Coastguard Worker * These are implemented differently on raw NAND vs eMMC/SATA/USB
638*8617a60dSAndroid Build Coastguard Worker * - On eMMC/SATA/USB, both of these refer to the same underlying
639*8617a60dSAndroid Build Coastguard Worker * storage, so they have the same size and LBA size. In this case,
640*8617a60dSAndroid Build Coastguard Worker * the GPT should not point to the same address as itself.
641*8617a60dSAndroid Build Coastguard Worker * - On raw NAND, the GPT is held on a portion of the SPI flash.
642*8617a60dSAndroid Build Coastguard Worker * Random access GPT operations refer to the SPI and streaming
643*8617a60dSAndroid Build Coastguard Worker * operations refer to NAND. The GPT may therefore point into
644*8617a60dSAndroid Build Coastguard Worker * the same offsets as itself.
645*8617a60dSAndroid Build Coastguard Worker * These types are distinguished by the following flag and vb2_disk_info
646*8617a60dSAndroid Build Coastguard Worker * has separate fields to describe the random-access ("GPT") and
647*8617a60dSAndroid Build Coastguard Worker * streaming aspects of the disk. If a disk is random-access (i.e.
648*8617a60dSAndroid Build Coastguard Worker * not raw NAND) then these fields are equal.
649*8617a60dSAndroid Build Coastguard Worker */
650*8617a60dSAndroid Build Coastguard Worker #define VB2_DISK_FLAG_EXTERNAL_GPT (1 << 16)
651*8617a60dSAndroid Build Coastguard Worker
652*8617a60dSAndroid Build Coastguard Worker /* Information on a single disk. */
653*8617a60dSAndroid Build Coastguard Worker struct vb2_disk_info {
654*8617a60dSAndroid Build Coastguard Worker /* Disk handle. */
655*8617a60dSAndroid Build Coastguard Worker vb2ex_disk_handle_t handle;
656*8617a60dSAndroid Build Coastguard Worker /* Size of a random-access LBA sector in bytes. */
657*8617a60dSAndroid Build Coastguard Worker uint64_t bytes_per_lba;
658*8617a60dSAndroid Build Coastguard Worker /* Number of random-access LBA sectors on the device.
659*8617a60dSAndroid Build Coastguard Worker * If streaming_lba_count is 0, this stands in for the size of the
660*8617a60dSAndroid Build Coastguard Worker * randomly accessed portion as well as the streaming portion.
661*8617a60dSAndroid Build Coastguard Worker * Otherwise, this is only the randomly-accessed portion. */
662*8617a60dSAndroid Build Coastguard Worker uint64_t lba_count;
663*8617a60dSAndroid Build Coastguard Worker /* Number of streaming sectors on the device. */
664*8617a60dSAndroid Build Coastguard Worker uint64_t streaming_lba_count;
665*8617a60dSAndroid Build Coastguard Worker /* Flags (see VB2_DISK_FLAG_* constants). */
666*8617a60dSAndroid Build Coastguard Worker uint32_t flags;
667*8617a60dSAndroid Build Coastguard Worker /*
668*8617a60dSAndroid Build Coastguard Worker * Optional name string, for use in debugging. May be empty or null if
669*8617a60dSAndroid Build Coastguard Worker * not available.
670*8617a60dSAndroid Build Coastguard Worker */
671*8617a60dSAndroid Build Coastguard Worker const char *name;
672*8617a60dSAndroid Build Coastguard Worker };
673*8617a60dSAndroid Build Coastguard Worker
674*8617a60dSAndroid Build Coastguard Worker /**
675*8617a60dSAndroid Build Coastguard Worker * Attempt to load kernel from the specified device. On success, the output
676*8617a60dSAndroid Build Coastguard Worker * fields of params will be filled. The caller should set the input fields of
677*8617a60dSAndroid Build Coastguard Worker * params.
678*8617a60dSAndroid Build Coastguard Worker *
679*8617a60dSAndroid Build Coastguard Worker *
680*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
681*8617a60dSAndroid Build Coastguard Worker * @param params Params specific to loading the kernel
682*8617a60dSAndroid Build Coastguard Worker * @param disk_info Disk from which to read kernel
683*8617a60dSAndroid Build Coastguard Worker *
684*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
685*8617a60dSAndroid Build Coastguard Worker */
686*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_load_kernel(struct vb2_context *ctx,
687*8617a60dSAndroid Build Coastguard Worker struct vb2_kernel_params *params,
688*8617a60dSAndroid Build Coastguard Worker struct vb2_disk_info *disk_info);
689*8617a60dSAndroid Build Coastguard Worker
690*8617a60dSAndroid Build Coastguard Worker /* miniOS flags */
691*8617a60dSAndroid Build Coastguard Worker
692*8617a60dSAndroid Build Coastguard Worker /* Boot from non-active miniOS partition only. */
693*8617a60dSAndroid Build Coastguard Worker #define VB2_MINIOS_FLAG_NON_ACTIVE (1 << 0)
694*8617a60dSAndroid Build Coastguard Worker
695*8617a60dSAndroid Build Coastguard Worker /**
696*8617a60dSAndroid Build Coastguard Worker * Attempt to load miniOS kernel from the specified device. On success, the
697*8617a60dSAndroid Build Coastguard Worker * output fields of params will be filled. The caller should set the input
698*8617a60dSAndroid Build Coastguard Worker * fields of params.
699*8617a60dSAndroid Build Coastguard Worker *
700*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
701*8617a60dSAndroid Build Coastguard Worker * @param params Params specific to loading the kernel
702*8617a60dSAndroid Build Coastguard Worker * @param disk_info Disk from which to read kernel
703*8617a60dSAndroid Build Coastguard Worker * @param minios_flags Flags for miniOS
704*8617a60dSAndroid Build Coastguard Worker *
705*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
706*8617a60dSAndroid Build Coastguard Worker */
707*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_load_minios_kernel(struct vb2_context *ctx,
708*8617a60dSAndroid Build Coastguard Worker struct vb2_kernel_params *params,
709*8617a60dSAndroid Build Coastguard Worker struct vb2_disk_info *disk_info,
710*8617a60dSAndroid Build Coastguard Worker uint32_t minios_flags);
711*8617a60dSAndroid Build Coastguard Worker
712*8617a60dSAndroid Build Coastguard Worker /**
713*8617a60dSAndroid Build Coastguard Worker * Load the verified boot block (vblock) for a kernel.
714*8617a60dSAndroid Build Coastguard Worker *
715*8617a60dSAndroid Build Coastguard Worker * This function may be called multiple times, to load and verify the
716*8617a60dSAndroid Build Coastguard Worker * vblocks from multiple kernel partitions.
717*8617a60dSAndroid Build Coastguard Worker *
718*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
719*8617a60dSAndroid Build Coastguard Worker * @param stream Kernel stream
720*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
721*8617a60dSAndroid Build Coastguard Worker */
722*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_load_kernel_vblock(struct vb2_context *ctx);
723*8617a60dSAndroid Build Coastguard Worker
724*8617a60dSAndroid Build Coastguard Worker /**
725*8617a60dSAndroid Build Coastguard Worker * Get the size and offset of the kernel data for the most recent vblock.
726*8617a60dSAndroid Build Coastguard Worker *
727*8617a60dSAndroid Build Coastguard Worker * Valid after a successful call to vb2api_load_kernel_vblock().
728*8617a60dSAndroid Build Coastguard Worker *
729*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
730*8617a60dSAndroid Build Coastguard Worker * @param offset_ptr Destination for offset in bytes of kernel data as
731*8617a60dSAndroid Build Coastguard Worker * reported by vblock.
732*8617a60dSAndroid Build Coastguard Worker * @param size_ptr Destination for size of kernel data in bytes.
733*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
734*8617a60dSAndroid Build Coastguard Worker */
735*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_get_kernel_size(struct vb2_context *ctx,
736*8617a60dSAndroid Build Coastguard Worker uint32_t *offset_ptr, uint32_t *size_ptr);
737*8617a60dSAndroid Build Coastguard Worker
738*8617a60dSAndroid Build Coastguard Worker /**
739*8617a60dSAndroid Build Coastguard Worker * Verify kernel data using the previously loaded kernel vblock.
740*8617a60dSAndroid Build Coastguard Worker *
741*8617a60dSAndroid Build Coastguard Worker * Valid after a successful call to vb2api_load_kernel_vblock(). This allows
742*8617a60dSAndroid Build Coastguard Worker * the caller to load or map the kernel data, as appropriate, and pass the
743*8617a60dSAndroid Build Coastguard Worker * pointer to the kernel data into vboot.
744*8617a60dSAndroid Build Coastguard Worker *
745*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
746*8617a60dSAndroid Build Coastguard Worker * @param buf Pointer to kernel data
747*8617a60dSAndroid Build Coastguard Worker * @param size Size of kernel data in bytes
748*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
749*8617a60dSAndroid Build Coastguard Worker */
750*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_verify_kernel_data(struct vb2_context *ctx, const void *buf,
751*8617a60dSAndroid Build Coastguard Worker uint32_t size);
752*8617a60dSAndroid Build Coastguard Worker
753*8617a60dSAndroid Build Coastguard Worker /**
754*8617a60dSAndroid Build Coastguard Worker * Clean up after kernel verification.
755*8617a60dSAndroid Build Coastguard Worker *
756*8617a60dSAndroid Build Coastguard Worker * Call this after successfully loading a vblock and verifying kernel data,
757*8617a60dSAndroid Build Coastguard Worker * or if you've run out of boot devices and/or kernel partitions.
758*8617a60dSAndroid Build Coastguard Worker *
759*8617a60dSAndroid Build Coastguard Worker * This cleans up intermediate data structures in the vboot context, and
760*8617a60dSAndroid Build Coastguard Worker * updates the version in the secure data if necessary.
761*8617a60dSAndroid Build Coastguard Worker */
762*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_kernel_phase3(struct vb2_context *ctx);
763*8617a60dSAndroid Build Coastguard Worker
764*8617a60dSAndroid Build Coastguard Worker /**
765*8617a60dSAndroid Build Coastguard Worker * Read the hardware ID from the GBB, and store it onto the given buffer.
766*8617a60dSAndroid Build Coastguard Worker *
767*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context.
768*8617a60dSAndroid Build Coastguard Worker * @param hwid Buffer to store HWID, which will be null-terminated.
769*8617a60dSAndroid Build Coastguard Worker * @param size Maximum size of HWID including null terminator. HWID
770*8617a60dSAndroid Build Coastguard Worker * length may not exceed 256 (VB2_GBB_HWID_MAX_SIZE), so
771*8617a60dSAndroid Build Coastguard Worker * this value is suggested. If size is too small, then
772*8617a60dSAndroid Build Coastguard Worker * VB2_ERROR_INVALID_PARAMETER is returned. Actual size
773*8617a60dSAndroid Build Coastguard Worker * of the output HWID string is returned in this pointer,
774*8617a60dSAndroid Build Coastguard Worker * also including null terminator.
775*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
776*8617a60dSAndroid Build Coastguard Worker */
777*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_gbb_read_hwid(struct vb2_context *ctx, char *hwid,
778*8617a60dSAndroid Build Coastguard Worker uint32_t *size);
779*8617a60dSAndroid Build Coastguard Worker
780*8617a60dSAndroid Build Coastguard Worker /**
781*8617a60dSAndroid Build Coastguard Worker * Retrieve current GBB flags.
782*8617a60dSAndroid Build Coastguard Worker *
783*8617a60dSAndroid Build Coastguard Worker * See enum vb2_gbb_flag in 2gbb_flags.h for a list of all GBB flags.
784*8617a60dSAndroid Build Coastguard Worker *
785*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context.
786*8617a60dSAndroid Build Coastguard Worker *
787*8617a60dSAndroid Build Coastguard Worker * @return vb2_gbb_flags_t representing current GBB flags.
788*8617a60dSAndroid Build Coastguard Worker */
789*8617a60dSAndroid Build Coastguard Worker vb2_gbb_flags_t vb2api_gbb_get_flags(struct vb2_context *ctx);
790*8617a60dSAndroid Build Coastguard Worker
791*8617a60dSAndroid Build Coastguard Worker /**
792*8617a60dSAndroid Build Coastguard Worker * Get the size of the signed firmware body.
793*8617a60dSAndroid Build Coastguard Worker *
794*8617a60dSAndroid Build Coastguard Worker * This is only legal to call after vb2api_fw_phase3() has returned
795*8617a60dSAndroid Build Coastguard Worker * successfully, and will die otherwise. This should never be called when
796*8617a60dSAndroid Build Coastguard Worker * running from a coreboot image that has CONFIG_VBOOT_CBFS_INTEGRATION=y set,
797*8617a60dSAndroid Build Coastguard Worker * or it will also die (with data size in signature being 0). In that case,
798*8617a60dSAndroid Build Coastguard Worker * vb2api_get_metadata_hash() should be used instead.
799*8617a60dSAndroid Build Coastguard Worker *
800*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
801*8617a60dSAndroid Build Coastguard Worker *
802*8617a60dSAndroid Build Coastguard Worker * @return The firmware body size in bytes (or 0 if called too early).
803*8617a60dSAndroid Build Coastguard Worker */
804*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_get_firmware_size(struct vb2_context *ctx);
805*8617a60dSAndroid Build Coastguard Worker
806*8617a60dSAndroid Build Coastguard Worker /**
807*8617a60dSAndroid Build Coastguard Worker * Check if this firmware was bundled with the well-known public developer key
808*8617a60dSAndroid Build Coastguard Worker * set (more specifically, checks the recovery key in recovery mode and the
809*8617a60dSAndroid Build Coastguard Worker * kernel subkey from the firmware preamble in other modes). This is a best
810*8617a60dSAndroid Build Coastguard Worker * effort check that could be misled by a specifically crafted key.
811*8617a60dSAndroid Build Coastguard Worker *
812*8617a60dSAndroid Build Coastguard Worker * May only be called after vb2api_kernel_phase1() has run.
813*8617a60dSAndroid Build Coastguard Worker *
814*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
815*8617a60dSAndroid Build Coastguard Worker *
816*8617a60dSAndroid Build Coastguard Worker * @return 1 for developer keys, 0 for any others.
817*8617a60dSAndroid Build Coastguard Worker */
818*8617a60dSAndroid Build Coastguard Worker int vb2api_is_developer_signed(struct vb2_context *ctx);
819*8617a60dSAndroid Build Coastguard Worker
820*8617a60dSAndroid Build Coastguard Worker /**
821*8617a60dSAndroid Build Coastguard Worker * Return the current kernel rollback version from secdata.
822*8617a60dSAndroid Build Coastguard Worker *
823*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
824*8617a60dSAndroid Build Coastguard Worker *
825*8617a60dSAndroid Build Coastguard Worker * @return The rollback version number.
826*8617a60dSAndroid Build Coastguard Worker */
827*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_get_kernel_rollback_version(struct vb2_context *ctx);
828*8617a60dSAndroid Build Coastguard Worker
829*8617a60dSAndroid Build Coastguard Worker /**
830*8617a60dSAndroid Build Coastguard Worker * If no display is available, set DISPLAY_REQUEST in nvdata.
831*8617a60dSAndroid Build Coastguard Worker *
832*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot2 context
833*8617a60dSAndroid Build Coastguard Worker * @return 1 if DISPLAY_REQUEST is set and a reboot is required, or 0 otherwise.
834*8617a60dSAndroid Build Coastguard Worker */
835*8617a60dSAndroid Build Coastguard Worker int vb2api_need_reboot_for_display(struct vb2_context *ctx);
836*8617a60dSAndroid Build Coastguard Worker
837*8617a60dSAndroid Build Coastguard Worker /**
838*8617a60dSAndroid Build Coastguard Worker * Get the current recovery reason.
839*8617a60dSAndroid Build Coastguard Worker *
840*8617a60dSAndroid Build Coastguard Worker * See enum vb2_nv_recovery in 2recovery_reasons.h.
841*8617a60dSAndroid Build Coastguard Worker *
842*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
843*8617a60dSAndroid Build Coastguard Worker * @return Current recovery reason.
844*8617a60dSAndroid Build Coastguard Worker */
845*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_get_recovery_reason(struct vb2_context *ctx);
846*8617a60dSAndroid Build Coastguard Worker
847*8617a60dSAndroid Build Coastguard Worker /**
848*8617a60dSAndroid Build Coastguard Worker * Get the current locale id from nvdata.
849*8617a60dSAndroid Build Coastguard Worker *
850*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
851*8617a60dSAndroid Build Coastguard Worker * @return Current locale id.
852*8617a60dSAndroid Build Coastguard Worker */
853*8617a60dSAndroid Build Coastguard Worker uint32_t vb2api_get_locale_id(struct vb2_context *ctx);
854*8617a60dSAndroid Build Coastguard Worker
855*8617a60dSAndroid Build Coastguard Worker /**
856*8617a60dSAndroid Build Coastguard Worker * Set the locale id in nvdata.
857*8617a60dSAndroid Build Coastguard Worker *
858*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
859*8617a60dSAndroid Build Coastguard Worker * @param locale_id The locale id to be set
860*8617a60dSAndroid Build Coastguard Worker */
861*8617a60dSAndroid Build Coastguard Worker void vb2api_set_locale_id(struct vb2_context *ctx, uint32_t locale_id);
862*8617a60dSAndroid Build Coastguard Worker
863*8617a60dSAndroid Build Coastguard Worker /**
864*8617a60dSAndroid Build Coastguard Worker * Whether diagnostic UI functionality is enabled or not.
865*8617a60dSAndroid Build Coastguard Worker *
866*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
867*8617a60dSAndroid Build Coastguard Worker * @return 1 if enabled, 0 if disabled.
868*8617a60dSAndroid Build Coastguard Worker */
869*8617a60dSAndroid Build Coastguard Worker int vb2api_diagnostic_ui_enabled(struct vb2_context *ctx);
870*8617a60dSAndroid Build Coastguard Worker
871*8617a60dSAndroid Build Coastguard Worker /* Default boot target in developer mode. */
872*8617a60dSAndroid Build Coastguard Worker enum vb2_dev_default_boot_target {
873*8617a60dSAndroid Build Coastguard Worker /* Default to boot from internal disk. */
874*8617a60dSAndroid Build Coastguard Worker VB2_DEV_DEFAULT_BOOT_TARGET_INTERNAL = 0,
875*8617a60dSAndroid Build Coastguard Worker
876*8617a60dSAndroid Build Coastguard Worker /* Default to boot from external disk. */
877*8617a60dSAndroid Build Coastguard Worker VB2_DEV_DEFAULT_BOOT_TARGET_EXTERNAL = 1,
878*8617a60dSAndroid Build Coastguard Worker
879*8617a60dSAndroid Build Coastguard Worker /* Default to boot altfw. */
880*8617a60dSAndroid Build Coastguard Worker VB2_DEV_DEFAULT_BOOT_TARGET_ALTFW = 2,
881*8617a60dSAndroid Build Coastguard Worker };
882*8617a60dSAndroid Build Coastguard Worker
883*8617a60dSAndroid Build Coastguard Worker /**
884*8617a60dSAndroid Build Coastguard Worker * Get the default boot target in developer mode. This function must be called
885*8617a60dSAndroid Build Coastguard Worker * after vb2api_kernel_phase1.
886*8617a60dSAndroid Build Coastguard Worker *
887*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
888*8617a60dSAndroid Build Coastguard Worker * @return The developer mode default boot target.
889*8617a60dSAndroid Build Coastguard Worker */
890*8617a60dSAndroid Build Coastguard Worker enum vb2_dev_default_boot_target vb2api_get_dev_default_boot_target(
891*8617a60dSAndroid Build Coastguard Worker struct vb2_context *ctx);
892*8617a60dSAndroid Build Coastguard Worker
893*8617a60dSAndroid Build Coastguard Worker /**
894*8617a60dSAndroid Build Coastguard Worker * Whether to use short delay instead of the normal delay in developer screens.
895*8617a60dSAndroid Build Coastguard Worker *
896*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
897*8617a60dSAndroid Build Coastguard Worker * @return 1 for short delay and 0 otherwise.
898*8617a60dSAndroid Build Coastguard Worker */
899*8617a60dSAndroid Build Coastguard Worker int vb2api_use_short_dev_screen_delay(struct vb2_context *ctx);
900*8617a60dSAndroid Build Coastguard Worker
901*8617a60dSAndroid Build Coastguard Worker /**
902*8617a60dSAndroid Build Coastguard Worker * Request to enable developer mode.
903*8617a60dSAndroid Build Coastguard Worker *
904*8617a60dSAndroid Build Coastguard Worker * Enables the developer flag in vb2_context firmware secdata. Note that
905*8617a60dSAndroid Build Coastguard Worker * modified secdata must be saved for change to apply on reboot.
906*8617a60dSAndroid Build Coastguard Worker *
907*8617a60dSAndroid Build Coastguard Worker * NOTE: Doesn't update the LAST_BOOT_DEVELOPER secdata flag. That should be
908*8617a60dSAndroid Build Coastguard Worker * done on the next boot.
909*8617a60dSAndroid Build Coastguard Worker *
910*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
911*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS if success; error if enabling developer mode is not
912*8617a60dSAndroid Build Coastguard Worker * allowed.
913*8617a60dSAndroid Build Coastguard Worker */
914*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_enable_developer_mode(struct vb2_context *ctx);
915*8617a60dSAndroid Build Coastguard Worker
916*8617a60dSAndroid Build Coastguard Worker /**
917*8617a60dSAndroid Build Coastguard Worker * Request to disable developer mode by setting VB2_NV_DISABLE_DEV_REQUEST.
918*8617a60dSAndroid Build Coastguard Worker *
919*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
920*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS if success; other errors if the check of
921*8617a60dSAndroid Build Coastguard Worker * VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON failed.
922*8617a60dSAndroid Build Coastguard Worker */
923*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_disable_developer_mode(struct vb2_context *ctx);
924*8617a60dSAndroid Build Coastguard Worker
925*8617a60dSAndroid Build Coastguard Worker /**
926*8617a60dSAndroid Build Coastguard Worker * Request diagnostics by setting VB2_NV_DIAG_REQUEST.
927*8617a60dSAndroid Build Coastguard Worker *
928*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
929*8617a60dSAndroid Build Coastguard Worker */
930*8617a60dSAndroid Build Coastguard Worker void vb2api_request_diagnostics(struct vb2_context *ctx);
931*8617a60dSAndroid Build Coastguard Worker
932*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
933*8617a60dSAndroid Build Coastguard Worker /* APIs provided by the caller to verified boot */
934*8617a60dSAndroid Build Coastguard Worker
935*8617a60dSAndroid Build Coastguard Worker /**
936*8617a60dSAndroid Build Coastguard Worker * Read a verified boot resource.
937*8617a60dSAndroid Build Coastguard Worker *
938*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
939*8617a60dSAndroid Build Coastguard Worker * @param index Resource index to read
940*8617a60dSAndroid Build Coastguard Worker * @param offset Byte offset within resource to start at
941*8617a60dSAndroid Build Coastguard Worker * @param buf Destination for data
942*8617a60dSAndroid Build Coastguard Worker * @param size Amount of data to read
943*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
944*8617a60dSAndroid Build Coastguard Worker */
945*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_read_resource(struct vb2_context *ctx,
946*8617a60dSAndroid Build Coastguard Worker enum vb2_resource_index index, uint32_t offset,
947*8617a60dSAndroid Build Coastguard Worker void *buf, uint32_t size);
948*8617a60dSAndroid Build Coastguard Worker
949*8617a60dSAndroid Build Coastguard Worker /**
950*8617a60dSAndroid Build Coastguard Worker * Print debug output.
951*8617a60dSAndroid Build Coastguard Worker *
952*8617a60dSAndroid Build Coastguard Worker * This should work like printf(). If func!=NULL, it will be a string with
953*8617a60dSAndroid Build Coastguard Worker * the current function name; that can be used to generate prettier debug
954*8617a60dSAndroid Build Coastguard Worker * output. If func==NULL, don't print any extra header/trailer so that this
955*8617a60dSAndroid Build Coastguard Worker * can be used to composite a bigger output string from several calls - for
956*8617a60dSAndroid Build Coastguard Worker * example, when doing a hex dump.
957*8617a60dSAndroid Build Coastguard Worker *
958*8617a60dSAndroid Build Coastguard Worker * @param func Function name generating output, or NULL.
959*8617a60dSAndroid Build Coastguard Worker * @param fmt Printf format string
960*8617a60dSAndroid Build Coastguard Worker */
961*8617a60dSAndroid Build Coastguard Worker __attribute__((format(printf, 2, 3)))
962*8617a60dSAndroid Build Coastguard Worker void vb2ex_printf(const char *func, const char *fmt, ...);
963*8617a60dSAndroid Build Coastguard Worker
964*8617a60dSAndroid Build Coastguard Worker /**
965*8617a60dSAndroid Build Coastguard Worker * Initialize the hardware crypto engine to calculate a block-style digest.
966*8617a60dSAndroid Build Coastguard Worker *
967*8617a60dSAndroid Build Coastguard Worker * @param hash_alg Hash algorithm to use
968*8617a60dSAndroid Build Coastguard Worker * @param data_size Expected total size of data to hash, or 0. If 0, the
969*8617a60dSAndroid Build Coastguard Worker * total size is not known in advance. Implementations that
970*8617a60dSAndroid Build Coastguard Worker * cannot handle unknown sizes should return UNSUPPORTED
971*8617a60dSAndroid Build Coastguard Worker * in that case. If the value is non-zero, implementations
972*8617a60dSAndroid Build Coastguard Worker * can trust it to be accurate.
973*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code (HWCRYPTO_UNSUPPORTED not fatal).
974*8617a60dSAndroid Build Coastguard Worker */
975*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_hwcrypto_digest_init(enum vb2_hash_algorithm hash_alg,
976*8617a60dSAndroid Build Coastguard Worker uint32_t data_size);
977*8617a60dSAndroid Build Coastguard Worker
978*8617a60dSAndroid Build Coastguard Worker /**
979*8617a60dSAndroid Build Coastguard Worker * Extend the hash in the hardware crypto engine with another block of data.
980*8617a60dSAndroid Build Coastguard Worker *
981*8617a60dSAndroid Build Coastguard Worker * @param buf Next data block to hash
982*8617a60dSAndroid Build Coastguard Worker * @param size Length of data block in bytes
983*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
984*8617a60dSAndroid Build Coastguard Worker */
985*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_hwcrypto_digest_extend(const uint8_t *buf, uint32_t size);
986*8617a60dSAndroid Build Coastguard Worker
987*8617a60dSAndroid Build Coastguard Worker /**
988*8617a60dSAndroid Build Coastguard Worker * Finalize the digest in the hardware crypto engine and extract the result.
989*8617a60dSAndroid Build Coastguard Worker *
990*8617a60dSAndroid Build Coastguard Worker * @param digest Destination buffer for resulting digest
991*8617a60dSAndroid Build Coastguard Worker * @param digest_size Length of digest buffer in bytes
992*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
993*8617a60dSAndroid Build Coastguard Worker */
994*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_hwcrypto_digest_finalize(uint8_t *digest,
995*8617a60dSAndroid Build Coastguard Worker uint32_t digest_size);
996*8617a60dSAndroid Build Coastguard Worker
997*8617a60dSAndroid Build Coastguard Worker /**
998*8617a60dSAndroid Build Coastguard Worker * Verify a RSA PKCS1.5 signature in hardware crypto engine
999*8617a60dSAndroid Build Coastguard Worker * against an expected hash digest.
1000*8617a60dSAndroid Build Coastguard Worker *
1001*8617a60dSAndroid Build Coastguard Worker * @param key Key to use in signature verification
1002*8617a60dSAndroid Build Coastguard Worker * @param sig Signature to verify (destroyed in process)
1003*8617a60dSAndroid Build Coastguard Worker * @param digest Digest of signed data
1004*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code (HWCRYPTO_UNSUPPORTED not fatal).
1005*8617a60dSAndroid Build Coastguard Worker */
1006*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_hwcrypto_rsa_verify_digest(const struct vb2_public_key *key,
1007*8617a60dSAndroid Build Coastguard Worker const uint8_t *sig,
1008*8617a60dSAndroid Build Coastguard Worker const uint8_t *digest);
1009*8617a60dSAndroid Build Coastguard Worker
1010*8617a60dSAndroid Build Coastguard Worker /**
1011*8617a60dSAndroid Build Coastguard Worker * Calculate modexp using hardware crypto engine.
1012*8617a60dSAndroid Build Coastguard Worker *
1013*8617a60dSAndroid Build Coastguard Worker * @param key Key to use in signing
1014*8617a60dSAndroid Build Coastguard Worker * @param inout Input and output big-endian byte array
1015*8617a60dSAndroid Build Coastguard Worker * @param workbuf Work buffer
1016*8617a60dSAndroid Build Coastguard Worker * @param workbuf_size Work buffer size
1017*8617a60dSAndroid Build Coastguard Worker * @param exp RSA public exponent: either 65537 (F4) or 3
1018*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, HWCRYPTO_UNSUPPORTED or WORKBUF_SMALL.
1019*8617a60dSAndroid Build Coastguard Worker */
1020*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_hwcrypto_modexp(const struct vb2_public_key *key,
1021*8617a60dSAndroid Build Coastguard Worker uint8_t *inout,
1022*8617a60dSAndroid Build Coastguard Worker void *workbuf, size_t workbuf_size,
1023*8617a60dSAndroid Build Coastguard Worker int exp);
1024*8617a60dSAndroid Build Coastguard Worker
1025*8617a60dSAndroid Build Coastguard Worker /*
1026*8617a60dSAndroid Build Coastguard Worker * Report if hardware crypto is allowed in the current context. It may be
1027*8617a60dSAndroid Build Coastguard Worker * disabled by TPM flag and is categorically disallowed in recovery mode.
1028*8617a60dSAndroid Build Coastguard Worker *
1029*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1030*8617a60dSAndroid Build Coastguard Worker * @returns 1 if hardware crypto is allowed, 0 if it is forbidden.
1031*8617a60dSAndroid Build Coastguard Worker */
1032*8617a60dSAndroid Build Coastguard Worker bool vb2api_hwcrypto_allowed(struct vb2_context *ctx);
1033*8617a60dSAndroid Build Coastguard Worker
1034*8617a60dSAndroid Build Coastguard Worker /*
1035*8617a60dSAndroid Build Coastguard Worker * Abort vboot flow due to a failed assertion or broken assumption.
1036*8617a60dSAndroid Build Coastguard Worker *
1037*8617a60dSAndroid Build Coastguard Worker * Likely due to caller misusing vboot (e.g. calling API functions
1038*8617a60dSAndroid Build Coastguard Worker * out-of-order, filling in vb2_context fields inappropriately).
1039*8617a60dSAndroid Build Coastguard Worker * Implementation should reboot or halt the machine, or fall back to some
1040*8617a60dSAndroid Build Coastguard Worker * alternative boot flow. Retrying vboot is unlikely to succeed.
1041*8617a60dSAndroid Build Coastguard Worker */
1042*8617a60dSAndroid Build Coastguard Worker void vb2ex_abort(void);
1043*8617a60dSAndroid Build Coastguard Worker
1044*8617a60dSAndroid Build Coastguard Worker /**
1045*8617a60dSAndroid Build Coastguard Worker * Commit any pending data to disk.
1046*8617a60dSAndroid Build Coastguard Worker *
1047*8617a60dSAndroid Build Coastguard Worker * Commit nvdata and secdata spaces if modified. Normally this should be
1048*8617a60dSAndroid Build Coastguard Worker * performed after vboot has completed executing and control has been passed
1049*8617a60dSAndroid Build Coastguard Worker * back to the caller. However, in certain kernel verification cases (e.g.
1050*8617a60dSAndroid Build Coastguard Worker * right before attempting to boot an OS; from a UI screen which requires
1051*8617a60dSAndroid Build Coastguard Worker * user-initiated shutdown; just prior to triggering battery cut-off), the
1052*8617a60dSAndroid Build Coastguard Worker * caller may not get a chance to commit this data.
1053*8617a60dSAndroid Build Coastguard Worker *
1054*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1055*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
1056*8617a60dSAndroid Build Coastguard Worker */
1057*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_commit_data(struct vb2_context *ctx);
1058*8617a60dSAndroid Build Coastguard Worker
1059*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
1060*8617a60dSAndroid Build Coastguard Worker /* TPM functionality */
1061*8617a60dSAndroid Build Coastguard Worker
1062*8617a60dSAndroid Build Coastguard Worker /**
1063*8617a60dSAndroid Build Coastguard Worker * Initialize the TPM.
1064*8617a60dSAndroid Build Coastguard Worker *
1065*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
1066*8617a60dSAndroid Build Coastguard Worker */
1067*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_tpm_init(void);
1068*8617a60dSAndroid Build Coastguard Worker
1069*8617a60dSAndroid Build Coastguard Worker /**
1070*8617a60dSAndroid Build Coastguard Worker * Close and open the TPM.
1071*8617a60dSAndroid Build Coastguard Worker *
1072*8617a60dSAndroid Build Coastguard Worker * This is needed for running more complex commands at user level, such as
1073*8617a60dSAndroid Build Coastguard Worker * TPM_TakeOwnership, since the TPM device can be opened only by one process at
1074*8617a60dSAndroid Build Coastguard Worker * a time.
1075*8617a60dSAndroid Build Coastguard Worker *
1076*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
1077*8617a60dSAndroid Build Coastguard Worker */
1078*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_tpm_close(void);
1079*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_tpm_open(void);
1080*8617a60dSAndroid Build Coastguard Worker
1081*8617a60dSAndroid Build Coastguard Worker /**
1082*8617a60dSAndroid Build Coastguard Worker * Send request to TPM and receive response
1083*8617a60dSAndroid Build Coastguard Worker *
1084*8617a60dSAndroid Build Coastguard Worker * Send a request_length-byte request to the TPM and receive a response. On
1085*8617a60dSAndroid Build Coastguard Worker * input, response_length is the size of the response buffer in bytes. On
1086*8617a60dSAndroid Build Coastguard Worker * exit, response_length is set to the actual received response length in
1087*8617a60dSAndroid Build Coastguard Worker * bytes.
1088*8617a60dSAndroid Build Coastguard Worker *
1089*8617a60dSAndroid Build Coastguard Worker * @param request Pointer to request buffer
1090*8617a60dSAndroid Build Coastguard Worker * @param request_length Number of bytes to send
1091*8617a60dSAndroid Build Coastguard Worker * @param response Pointer to response buffer
1092*8617a60dSAndroid Build Coastguard Worker * @param response_length Size of response buffer; on return,
1093*8617a60dSAndroid Build Coastguard Worker * set to number of received bytes
1094*8617a60dSAndroid Build Coastguard Worker * @return TPM_SUCCESS, or non-zero if error.
1095*8617a60dSAndroid Build Coastguard Worker */
1096*8617a60dSAndroid Build Coastguard Worker uint32_t vb2ex_tpm_send_recv(const uint8_t *request, uint32_t request_length,
1097*8617a60dSAndroid Build Coastguard Worker uint8_t *response, uint32_t *response_length);
1098*8617a60dSAndroid Build Coastguard Worker
1099*8617a60dSAndroid Build Coastguard Worker #ifdef CHROMEOS_ENVIRONMENT
1100*8617a60dSAndroid Build Coastguard Worker
1101*8617a60dSAndroid Build Coastguard Worker /**
1102*8617a60dSAndroid Build Coastguard Worker * Obtain cryptographically secure random bytes.
1103*8617a60dSAndroid Build Coastguard Worker *
1104*8617a60dSAndroid Build Coastguard Worker * This function is used to generate random nonces for TPM auth sessions for
1105*8617a60dSAndroid Build Coastguard Worker * example. As an implication, the generated random bytes should not be
1106*8617a60dSAndroid Build Coastguard Worker * predictable for a TPM communication interception attack. This implies a
1107*8617a60dSAndroid Build Coastguard Worker * local source of randomness should be used, i.e. this should not be wired to
1108*8617a60dSAndroid Build Coastguard Worker * the TPM RNG directly. Otherwise, an attacker with communication interception
1109*8617a60dSAndroid Build Coastguard Worker * abilities could launch replay attacks by reusing previous nonces.
1110*8617a60dSAndroid Build Coastguard Worker *
1111*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
1112*8617a60dSAndroid Build Coastguard Worker */
1113*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_tpm_get_random(uint8_t *buf, uint32_t length);
1114*8617a60dSAndroid Build Coastguard Worker
1115*8617a60dSAndroid Build Coastguard Worker #endif /* CHROMEOS_ENVIRONMENT */
1116*8617a60dSAndroid Build Coastguard Worker
1117*8617a60dSAndroid Build Coastguard Worker /* Modes for vb2ex_tpm_set_mode. */
1118*8617a60dSAndroid Build Coastguard Worker enum vb2_tpm_mode {
1119*8617a60dSAndroid Build Coastguard Worker /*
1120*8617a60dSAndroid Build Coastguard Worker * TPM is enabled tentatively, and may be set to either
1121*8617a60dSAndroid Build Coastguard Worker * ENABLED or DISABLED mode.
1122*8617a60dSAndroid Build Coastguard Worker */
1123*8617a60dSAndroid Build Coastguard Worker VB2_TPM_MODE_ENABLED_TENTATIVE = 0,
1124*8617a60dSAndroid Build Coastguard Worker
1125*8617a60dSAndroid Build Coastguard Worker /* TPM is enabled, and mode may not be changed. */
1126*8617a60dSAndroid Build Coastguard Worker VB2_TPM_MODE_ENABLED = 1,
1127*8617a60dSAndroid Build Coastguard Worker
1128*8617a60dSAndroid Build Coastguard Worker /* TPM is disabled, and mode may not be changed. */
1129*8617a60dSAndroid Build Coastguard Worker VB2_TPM_MODE_DISABLED = 2,
1130*8617a60dSAndroid Build Coastguard Worker };
1131*8617a60dSAndroid Build Coastguard Worker
1132*8617a60dSAndroid Build Coastguard Worker /**
1133*8617a60dSAndroid Build Coastguard Worker * Set the current TPM mode value, and validate that it was changed. If one
1134*8617a60dSAndroid Build Coastguard Worker * of the following occurs, the function call fails:
1135*8617a60dSAndroid Build Coastguard Worker * - TPM does not understand the instruction (old version)
1136*8617a60dSAndroid Build Coastguard Worker * - TPM has already left the TpmModeEnabledTentative mode
1137*8617a60dSAndroid Build Coastguard Worker * - TPM responds with a mode other than the requested mode
1138*8617a60dSAndroid Build Coastguard Worker * - Some other communication error occurs
1139*8617a60dSAndroid Build Coastguard Worker * Otherwise, the function call succeeds.
1140*8617a60dSAndroid Build Coastguard Worker *
1141*8617a60dSAndroid Build Coastguard Worker * @param mode_val Desired TPM mode to set. May be one of ENABLED
1142*8617a60dSAndroid Build Coastguard Worker * or DISABLED from vb2_tpm_mode enum.
1143*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
1144*8617a60dSAndroid Build Coastguard Worker */
1145*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_tpm_set_mode(enum vb2_tpm_mode mode_val);
1146*8617a60dSAndroid Build Coastguard Worker
1147*8617a60dSAndroid Build Coastguard Worker /**
1148*8617a60dSAndroid Build Coastguard Worker * Clear the TPM owner.
1149*8617a60dSAndroid Build Coastguard Worker *
1150*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1151*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
1152*8617a60dSAndroid Build Coastguard Worker */
1153*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_tpm_clear_owner(struct vb2_context *ctx);
1154*8617a60dSAndroid Build Coastguard Worker
1155*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
1156*8617a60dSAndroid Build Coastguard Worker /* Auxiliary firmware (auxfw) */
1157*8617a60dSAndroid Build Coastguard Worker
1158*8617a60dSAndroid Build Coastguard Worker /**
1159*8617a60dSAndroid Build Coastguard Worker * Sync all auxiliary firmware to the expected versions.
1160*8617a60dSAndroid Build Coastguard Worker *
1161*8617a60dSAndroid Build Coastguard Worker * This function will first check if an auxfw update is needed and
1162*8617a60dSAndroid Build Coastguard Worker * what the "severity" of that update is (i.e., if any auxfw devices
1163*8617a60dSAndroid Build Coastguard Worker * exist and the relative quickness of updating it. If the update is
1164*8617a60dSAndroid Build Coastguard Worker * deemed slow, it may display a screen to notify the user. The
1165*8617a60dSAndroid Build Coastguard Worker * platform is then instructed to perform the update. Finally, an EC
1166*8617a60dSAndroid Build Coastguard Worker * reboot to its RO section is performed to ensure that auxfw devices
1167*8617a60dSAndroid Build Coastguard Worker * are also reset and running the new firmware.
1168*8617a60dSAndroid Build Coastguard Worker *
1169*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot2 context
1170*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero error code.
1171*8617a60dSAndroid Build Coastguard Worker */
1172*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_auxfw_sync(struct vb2_context *ctx);
1173*8617a60dSAndroid Build Coastguard Worker
1174*8617a60dSAndroid Build Coastguard Worker /*
1175*8617a60dSAndroid Build Coastguard Worker * severity levels for an auxiliary firmware update request
1176*8617a60dSAndroid Build Coastguard Worker */
1177*8617a60dSAndroid Build Coastguard Worker enum vb2_auxfw_update_severity {
1178*8617a60dSAndroid Build Coastguard Worker /* no update needed and no protection needed */
1179*8617a60dSAndroid Build Coastguard Worker VB2_AUXFW_NO_DEVICE = 0,
1180*8617a60dSAndroid Build Coastguard Worker /* no update needed */
1181*8617a60dSAndroid Build Coastguard Worker VB2_AUXFW_NO_UPDATE = 1,
1182*8617a60dSAndroid Build Coastguard Worker /* update needed, can be done quickly */
1183*8617a60dSAndroid Build Coastguard Worker VB2_AUXFW_FAST_UPDATE = 2,
1184*8617a60dSAndroid Build Coastguard Worker /* update needed, "this would take a while..." */
1185*8617a60dSAndroid Build Coastguard Worker VB2_AUXFW_SLOW_UPDATE = 3,
1186*8617a60dSAndroid Build Coastguard Worker };
1187*8617a60dSAndroid Build Coastguard Worker
1188*8617a60dSAndroid Build Coastguard Worker /*
1189*8617a60dSAndroid Build Coastguard Worker * Check if any auxiliary firmware needs updating.
1190*8617a60dSAndroid Build Coastguard Worker *
1191*8617a60dSAndroid Build Coastguard Worker * This is called after the EC has been updated and is intended to
1192*8617a60dSAndroid Build Coastguard Worker * version-check additional firmware blobs such as TCPCs.
1193*8617a60dSAndroid Build Coastguard Worker *
1194*8617a60dSAndroid Build Coastguard Worker * @param severity return parameter for health of auxiliary firmware
1195*8617a60dSAndroid Build Coastguard Worker * (see vb2_auxfw_update_severity above)
1196*8617a60dSAndroid Build Coastguard Worker * @return VBERROR_... error, VB2_SUCCESS on success.
1197*8617a60dSAndroid Build Coastguard Worker */
1198*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_auxfw_check(enum vb2_auxfw_update_severity *severity);
1199*8617a60dSAndroid Build Coastguard Worker
1200*8617a60dSAndroid Build Coastguard Worker /*
1201*8617a60dSAndroid Build Coastguard Worker * Perform auxiliary firmware update(s).
1202*8617a60dSAndroid Build Coastguard Worker *
1203*8617a60dSAndroid Build Coastguard Worker * This is called after the EC has been updated and is intended to
1204*8617a60dSAndroid Build Coastguard Worker * update additional firmware blobs such as TCPCs.
1205*8617a60dSAndroid Build Coastguard Worker *
1206*8617a60dSAndroid Build Coastguard Worker * @return VBERROR_... error, VB2_SUCCESS on success.
1207*8617a60dSAndroid Build Coastguard Worker */
1208*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_auxfw_update(void);
1209*8617a60dSAndroid Build Coastguard Worker
1210*8617a60dSAndroid Build Coastguard Worker /*
1211*8617a60dSAndroid Build Coastguard Worker * Notify client that vboot is done with auxfw.
1212*8617a60dSAndroid Build Coastguard Worker *
1213*8617a60dSAndroid Build Coastguard Worker * If auxfw sync was successful, this will be called at the end so that
1214*8617a60dSAndroid Build Coastguard Worker * the client may perform actions that require the auxfw to be in its
1215*8617a60dSAndroid Build Coastguard Worker * final state. This may include protecting the communcations tunnels that
1216*8617a60dSAndroid Build Coastguard Worker * allow auxiliary firmware updates from the OS.
1217*8617a60dSAndroid Build Coastguard Worker *
1218*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1219*8617a60dSAndroid Build Coastguard Worker * @return VBERROR_... error, VB2_SUCCESS on success.
1220*8617a60dSAndroid Build Coastguard Worker */
1221*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_auxfw_finalize(struct vb2_context *ctx);
1222*8617a60dSAndroid Build Coastguard Worker
1223*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
1224*8617a60dSAndroid Build Coastguard Worker /* Embedded controller (EC) */
1225*8617a60dSAndroid Build Coastguard Worker
1226*8617a60dSAndroid Build Coastguard Worker /*
1227*8617a60dSAndroid Build Coastguard Worker * Firmware selection type for EC software sync logic. Note that we store
1228*8617a60dSAndroid Build Coastguard Worker * these in a uint32_t because enum maps to int, which isn't fixed-size.
1229*8617a60dSAndroid Build Coastguard Worker */
1230*8617a60dSAndroid Build Coastguard Worker enum vb2_firmware_selection {
1231*8617a60dSAndroid Build Coastguard Worker /* Read only firmware for normal or developer path. */
1232*8617a60dSAndroid Build Coastguard Worker VB_SELECT_FIRMWARE_READONLY = 3,
1233*8617a60dSAndroid Build Coastguard Worker /* Rewritable EC firmware currently set active */
1234*8617a60dSAndroid Build Coastguard Worker VB_SELECT_FIRMWARE_EC_ACTIVE = 4,
1235*8617a60dSAndroid Build Coastguard Worker /* Rewritable EC firmware currently not set active thus updatable */
1236*8617a60dSAndroid Build Coastguard Worker VB_SELECT_FIRMWARE_EC_UPDATE = 5,
1237*8617a60dSAndroid Build Coastguard Worker /* Keep this at the end */
1238*8617a60dSAndroid Build Coastguard Worker VB_SELECT_FIRMWARE_COUNT,
1239*8617a60dSAndroid Build Coastguard Worker };
1240*8617a60dSAndroid Build Coastguard Worker
1241*8617a60dSAndroid Build Coastguard Worker /**
1242*8617a60dSAndroid Build Coastguard Worker * Sync the Embedded Controller device to the expected version.
1243*8617a60dSAndroid Build Coastguard Worker *
1244*8617a60dSAndroid Build Coastguard Worker * This function will check if EC software sync is allowed, and if it
1245*8617a60dSAndroid Build Coastguard Worker * is, it will compare the expected image hash to the actual image
1246*8617a60dSAndroid Build Coastguard Worker * hash. If they are the same, the EC will simply jump to its RW
1247*8617a60dSAndroid Build Coastguard Worker * firwmare. Otherwise, the specified flash image will be updated to
1248*8617a60dSAndroid Build Coastguard Worker * the new version, and the EC will reboot into its new firmware.
1249*8617a60dSAndroid Build Coastguard Worker *
1250*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1251*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or non-zero if error.
1252*8617a60dSAndroid Build Coastguard Worker */
1253*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2api_ec_sync(struct vb2_context *ctx);
1254*8617a60dSAndroid Build Coastguard Worker
1255*8617a60dSAndroid Build Coastguard Worker /**
1256*8617a60dSAndroid Build Coastguard Worker * Check if the EC is currently running rewritable code.
1257*8617a60dSAndroid Build Coastguard Worker *
1258*8617a60dSAndroid Build Coastguard Worker * If the EC is in RO code, sets *in_rw=0.
1259*8617a60dSAndroid Build Coastguard Worker * If the EC is in RW code, sets *in_rw non-zero.
1260*8617a60dSAndroid Build Coastguard Worker * If the current EC image is unknown, returns error. */
1261*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_running_rw(int *in_rw);
1262*8617a60dSAndroid Build Coastguard Worker
1263*8617a60dSAndroid Build Coastguard Worker /**
1264*8617a60dSAndroid Build Coastguard Worker * Request the EC jump to its rewritable code. If successful, returns when the
1265*8617a60dSAndroid Build Coastguard Worker * EC has booting its RW code far enough to respond to subsequent commands.
1266*8617a60dSAndroid Build Coastguard Worker * Does nothing if the EC is already in its rewritable code.
1267*8617a60dSAndroid Build Coastguard Worker */
1268*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_jump_to_rw(void);
1269*8617a60dSAndroid Build Coastguard Worker
1270*8617a60dSAndroid Build Coastguard Worker /**
1271*8617a60dSAndroid Build Coastguard Worker * Tell the EC to refuse another jump until it reboots. Subsequent calls to
1272*8617a60dSAndroid Build Coastguard Worker * vb2ex_ec_jump_to_rw() in this boot will fail.
1273*8617a60dSAndroid Build Coastguard Worker */
1274*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_disable_jump(void);
1275*8617a60dSAndroid Build Coastguard Worker
1276*8617a60dSAndroid Build Coastguard Worker /**
1277*8617a60dSAndroid Build Coastguard Worker * Read the SHA-256 hash of the selected EC image.
1278*8617a60dSAndroid Build Coastguard Worker *
1279*8617a60dSAndroid Build Coastguard Worker * @param select Image to get hash of. RO or RW.
1280*8617a60dSAndroid Build Coastguard Worker * @param hash Pointer to the hash.
1281*8617a60dSAndroid Build Coastguard Worker * @param hash_size Pointer to the hash size.
1282*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
1283*8617a60dSAndroid Build Coastguard Worker */
1284*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_hash_image(enum vb2_firmware_selection select,
1285*8617a60dSAndroid Build Coastguard Worker const uint8_t **hash, int *hash_size);
1286*8617a60dSAndroid Build Coastguard Worker
1287*8617a60dSAndroid Build Coastguard Worker /**
1288*8617a60dSAndroid Build Coastguard Worker * Read the SHA-256 hash of the expected contents of the EC image associated
1289*8617a60dSAndroid Build Coastguard Worker * with the main firmware specified by the "select" argument.
1290*8617a60dSAndroid Build Coastguard Worker *
1291*8617a60dSAndroid Build Coastguard Worker * @param select Image to get expected hash for (RO or RW).
1292*8617a60dSAndroid Build Coastguard Worker * @param hash Pointer to the hash.
1293*8617a60dSAndroid Build Coastguard Worker * @param hash_size Pointer to the hash size (in bytes).
1294*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
1295*8617a60dSAndroid Build Coastguard Worker */
1296*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_get_expected_image_hash(enum vb2_firmware_selection select,
1297*8617a60dSAndroid Build Coastguard Worker const uint8_t **hash,
1298*8617a60dSAndroid Build Coastguard Worker int *hash_size);
1299*8617a60dSAndroid Build Coastguard Worker
1300*8617a60dSAndroid Build Coastguard Worker /**
1301*8617a60dSAndroid Build Coastguard Worker * Update the selected EC image to the expected version.
1302*8617a60dSAndroid Build Coastguard Worker *
1303*8617a60dSAndroid Build Coastguard Worker * @param select Image to get expected hash for (RO or RW).
1304*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
1305*8617a60dSAndroid Build Coastguard Worker */
1306*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_update_image(enum vb2_firmware_selection select);
1307*8617a60dSAndroid Build Coastguard Worker
1308*8617a60dSAndroid Build Coastguard Worker /**
1309*8617a60dSAndroid Build Coastguard Worker * Lock the EC code to prevent updates until the EC is rebooted.
1310*8617a60dSAndroid Build Coastguard Worker * Subsequent calls to vb2ex_ec_update_image() during boot will fail.
1311*8617a60dSAndroid Build Coastguard Worker *
1312*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
1313*8617a60dSAndroid Build Coastguard Worker */
1314*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_protect(void);
1315*8617a60dSAndroid Build Coastguard Worker
1316*8617a60dSAndroid Build Coastguard Worker /**
1317*8617a60dSAndroid Build Coastguard Worker * Perform EC post-verification / updating / jumping actions.
1318*8617a60dSAndroid Build Coastguard Worker *
1319*8617a60dSAndroid Build Coastguard Worker * This routine is called to perform certain actions that must wait until
1320*8617a60dSAndroid Build Coastguard Worker * after the EC resides in its `final` image (the image the EC will
1321*8617a60dSAndroid Build Coastguard Worker * run for the duration of boot). These actions include verifying that
1322*8617a60dSAndroid Build Coastguard Worker * enough power is available to continue with boot.
1323*8617a60dSAndroid Build Coastguard Worker *
1324*8617a60dSAndroid Build Coastguard Worker * @param ctx Pointer to vboot context.
1325*8617a60dSAndroid Build Coastguard Worker * @return VB2_SUCCESS, or error code on error.
1326*8617a60dSAndroid Build Coastguard Worker */
1327*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_vboot_done(struct vb2_context *ctx);
1328*8617a60dSAndroid Build Coastguard Worker
1329*8617a60dSAndroid Build Coastguard Worker /**
1330*8617a60dSAndroid Build Coastguard Worker * Request EC to stop discharging and cut-off battery.
1331*8617a60dSAndroid Build Coastguard Worker */
1332*8617a60dSAndroid Build Coastguard Worker vb2_error_t vb2ex_ec_battery_cutoff(void);
1333*8617a60dSAndroid Build Coastguard Worker
1334*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
1335*8617a60dSAndroid Build Coastguard Worker /* Functions for firmware UI. */
1336*8617a60dSAndroid Build Coastguard Worker
1337*8617a60dSAndroid Build Coastguard Worker /**
1338*8617a60dSAndroid Build Coastguard Worker * Get the vboot debug info.
1339*8617a60dSAndroid Build Coastguard Worker *
1340*8617a60dSAndroid Build Coastguard Worker * Return a pointer to the vboot debug info string which is guaranteed to be
1341*8617a60dSAndroid Build Coastguard Worker * null-terminated. The caller owns the string and should call free() when
1342*8617a60dSAndroid Build Coastguard Worker * finished with it.
1343*8617a60dSAndroid Build Coastguard Worker *
1344*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1345*8617a60dSAndroid Build Coastguard Worker * @return The pointer to the vboot debug info string. NULL on error.
1346*8617a60dSAndroid Build Coastguard Worker */
1347*8617a60dSAndroid Build Coastguard Worker char *vb2api_get_debug_info(struct vb2_context *ctx);
1348*8617a60dSAndroid Build Coastguard Worker
1349*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
1350*8617a60dSAndroid Build Coastguard Worker /* Timer. */
1351*8617a60dSAndroid Build Coastguard Worker
1352*8617a60dSAndroid Build Coastguard Worker /**
1353*8617a60dSAndroid Build Coastguard Worker * Read a millisecond timer.
1354*8617a60dSAndroid Build Coastguard Worker *
1355*8617a60dSAndroid Build Coastguard Worker * This should have a sufficient number of bits to avoid wraparound for at
1356*8617a60dSAndroid Build Coastguard Worker * least 10 minutes.
1357*8617a60dSAndroid Build Coastguard Worker *
1358*8617a60dSAndroid Build Coastguard Worker * @return Current timer value in milliseconds.
1359*8617a60dSAndroid Build Coastguard Worker */
1360*8617a60dSAndroid Build Coastguard Worker uint32_t vb2ex_mtime(void);
1361*8617a60dSAndroid Build Coastguard Worker
1362*8617a60dSAndroid Build Coastguard Worker /*****************************************************************************/
1363*8617a60dSAndroid Build Coastguard Worker /* Firmware slot information. */
1364*8617a60dSAndroid Build Coastguard Worker
1365*8617a60dSAndroid Build Coastguard Worker union vb2_fw_boot_info {
1366*8617a60dSAndroid Build Coastguard Worker uint8_t raw[4];
1367*8617a60dSAndroid Build Coastguard Worker struct {
1368*8617a60dSAndroid Build Coastguard Worker uint8_t tries : 4;
1369*8617a60dSAndroid Build Coastguard Worker uint8_t slot : 1;
1370*8617a60dSAndroid Build Coastguard Worker uint8_t prev_slot : 1;
1371*8617a60dSAndroid Build Coastguard Worker uint8_t prev_result : 2;
1372*8617a60dSAndroid Build Coastguard Worker uint8_t boot_mode;
1373*8617a60dSAndroid Build Coastguard Worker /* The following 2 bytes only exist for recovery mode */
1374*8617a60dSAndroid Build Coastguard Worker uint8_t recovery_reason;
1375*8617a60dSAndroid Build Coastguard Worker uint8_t recovery_subcode;
1376*8617a60dSAndroid Build Coastguard Worker };
1377*8617a60dSAndroid Build Coastguard Worker };
1378*8617a60dSAndroid Build Coastguard Worker
1379*8617a60dSAndroid Build Coastguard Worker /**
1380*8617a60dSAndroid Build Coastguard Worker * Return `vb2_fw_boot_info` and can be used
1381*8617a60dSAndroid Build Coastguard Worker * to log information about the current boot in a compact format.
1382*8617a60dSAndroid Build Coastguard Worker *
1383*8617a60dSAndroid Build Coastguard Worker * Note: Only call this API at minimum after `vb2api_fw_phase2` function
1384*8617a60dSAndroid Build Coastguard Worker * returns.
1385*8617a60dSAndroid Build Coastguard Worker *
1386*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1387*8617a60dSAndroid Build Coastguard Worker * @return filled out vb2 info as per `union vb2_fw_boot_info`.
1388*8617a60dSAndroid Build Coastguard Worker */
1389*8617a60dSAndroid Build Coastguard Worker union vb2_fw_boot_info vb2api_get_fw_boot_info(struct vb2_context *ctx);
1390*8617a60dSAndroid Build Coastguard Worker
1391*8617a60dSAndroid Build Coastguard Worker /**
1392*8617a60dSAndroid Build Coastguard Worker * Clear recovery request appropriately.
1393*8617a60dSAndroid Build Coastguard Worker *
1394*8617a60dSAndroid Build Coastguard Worker * To avoid the recovery request "sticking" and the user being in a permanent
1395*8617a60dSAndroid Build Coastguard Worker * recovery loop, the recovery request must be cleared and committed to nvdata.
1396*8617a60dSAndroid Build Coastguard Worker * Note that this should be done at some point after we are certain the system
1397*8617a60dSAndroid Build Coastguard Worker * does not require any reboots for non-vboot-related reasons (e.g. FSP
1398*8617a60dSAndroid Build Coastguard Worker * initialization), and before triggering a reboot to exit a transient recovery
1399*8617a60dSAndroid Build Coastguard Worker * mode (e.g. memory retraining request).
1400*8617a60dSAndroid Build Coastguard Worker *
1401*8617a60dSAndroid Build Coastguard Worker * In BROKEN cases, the recovery reason will be stowed away as subcode, to be
1402*8617a60dSAndroid Build Coastguard Worker * retrieved after the user reboots in manual recovery. In manual recovery,
1403*8617a60dSAndroid Build Coastguard Worker * subcode will be left alone to keep available for subsequent manual recovery
1404*8617a60dSAndroid Build Coastguard Worker * requests, or for accessing from userspace on the next boot.
1405*8617a60dSAndroid Build Coastguard Worker *
1406*8617a60dSAndroid Build Coastguard Worker * This function modifies nvdata in vb2_context, but the caller is still
1407*8617a60dSAndroid Build Coastguard Worker * expected to call vb2_commit_data.
1408*8617a60dSAndroid Build Coastguard Worker *
1409*8617a60dSAndroid Build Coastguard Worker * @param ctx Vboot context
1410*8617a60dSAndroid Build Coastguard Worker */
1411*8617a60dSAndroid Build Coastguard Worker void vb2api_clear_recovery(struct vb2_context *ctx);
1412*8617a60dSAndroid Build Coastguard Worker
1413*8617a60dSAndroid Build Coastguard Worker #endif /* VBOOT_REFERENCE_2API_H_ */
1414