xref: /aosp_15_r20/external/vboot_reference/firmware/2lib/include/2api.h (revision 8617a60d3594060b7ecbd21bc622a7c14f3cf2bc)
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