Track errno and errstr in the kthread
[akaros.git] / kern / include / crypto / 2struct.h
1 /* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2  * Use of this source code is governed by a BSD-style license that can be
3  * found in the LICENSE file.
4  *
5  * Data structure definitions for verified boot, for on-disk / in-eeprom
6  * data.
7  */
8
9 #pragma once
10 #include <stdint.h>
11 #include "2crypto.h"
12
13 /*
14  * Key block flags.
15  *
16  *The following flags set where the key is valid.  Not used by firmware
17  * verification; only kernel verification.
18  */
19 #define VB2_KEY_BLOCK_FLAG_DEVELOPER_0  0x01 /* Developer switch off */
20 #define VB2_KEY_BLOCK_FLAG_DEVELOPER_1  0x02 /* Developer switch on */
21 #define VB2_KEY_BLOCK_FLAG_RECOVERY_0   0x04 /* Not recovery mode */
22 #define VB2_KEY_BLOCK_FLAG_RECOVERY_1   0x08 /* Recovery mode */
23 #define VB2_GBB_HWID_DIGEST_SIZE        32
24
25 /****************************************************************************/
26
27 /* Flags for vb2_shared_data.flags */
28 enum vb2_shared_data_flags {
29         /* User has explicitly and physically requested recovery */
30         VB2_SD_FLAG_MANUAL_RECOVERY = (1 << 0),
31
32         /* Developer mode is enabled */
33         /* TODO: should have been VB2_SD_FLAG_DEV_MODE_ENABLED */
34         VB2_SD_DEV_MODE_ENABLED = (1 << 1),
35
36         /*
37          * TODO: might be nice to add flags for why dev mode is enabled - via
38          * gbb, virtual dev switch, or forced on for testing.
39          */
40
41         /* Kernel keyblock was verified by signature (not just hash) */
42         VB2_SD_FLAG_KERNEL_SIGNED = (1 << 2),
43 };
44
45 /* Flags for vb2_shared_data.status */
46 enum vb2_shared_data_status {
47         /* Reinitialized NV data due to invalid checksum */
48         VB2_SD_STATUS_NV_REINIT = (1 << 0),
49
50         /* NV data has been initialized */
51         VB2_SD_STATUS_NV_INIT = (1 << 1),
52
53         /* Secure data initialized */
54         VB2_SD_STATUS_SECDATA_INIT = (1 << 2),
55
56         /* Chose a firmware slot */
57         VB2_SD_STATUS_CHOSE_SLOT = (1 << 3),
58
59         /* Secure data kernel version space initialized */
60         VB2_SD_STATUS_SECDATAK_INIT = (1 << 4),
61 };
62
63 /*
64  * Data shared between vboot API calls.  Stored at the start of the work
65  * buffer.
66  */
67 struct vb2_shared_data {
68         /* Flags; see enum vb2_shared_data_flags */
69         uint32_t flags;
70
71         /* Flags from GBB header */
72         uint32_t gbb_flags;
73
74         /*
75          * Reason we are in recovery mode this boot (enum vb2_nv_recovery), or
76          * 0 if we aren't.
77          */
78         uint32_t recovery_reason;
79
80         /* Firmware slot used last boot (0=A, 1=B) */
81         uint32_t last_fw_slot;
82
83         /* Result of last boot (enum vb2_fw_result) */
84         uint32_t last_fw_result;
85
86         /* Firmware slot used this boot */
87         uint32_t fw_slot;
88
89         /*
90          * Version for this slot (top 16 bits = key, lower 16 bits = firmware).
91          *
92          * TODO: Make this a union to allow getting/setting those versions
93          * separately?
94          */
95         uint32_t fw_version;
96
97         /* Version stored in secdata (must be <= fw_version to boot). */
98         uint32_t fw_version_secdata;
99
100         /*
101          * Status flags for this boot; see enum vb2_shared_data_status.  Status
102          * is "what we've done"; flags above are "decisions we've made".
103          */
104         uint32_t status;
105
106         /**********************************************************************
107          * Data from kernel verification stage.
108          *
109          * TODO: shouldn't be part of the main struct, since that needlessly
110          * uses more memory during firmware verification.
111          */
112
113         /*
114          * Version for the current kernel (top 16 bits = key, lower 16 bits =
115          * kernel preamble).
116          *
117          * TODO: Make this a union to allow getting/setting those versions
118          * separately?
119          */
120         uint32_t kernel_version;
121
122         /* Kernel version from secdatak (must be <= kernel_version to boot) */
123         uint32_t kernel_version_secdatak;
124
125         /**********************************************************************
126          * Temporary variables used during firmware verification.  These don't
127          * really need to persist through to the OS, but there's nowhere else
128          * we can put them.
129          */
130
131         /* Root key offset and size from GBB header */
132         uint32_t gbb_rootkey_offset;
133         uint32_t gbb_rootkey_size;
134
135         /* HWID digest from GBB header */
136         uint8_t gbb_hwid_digest[VB2_GBB_HWID_DIGEST_SIZE];
137
138         /* Offset of preamble from start of vblock */
139         uint32_t vblock_preamble_offset;
140
141         /*
142          * Offset and size of packed data key in work buffer.  Size is 0 if
143          * data key is not stored in the work buffer.
144          */
145         uint32_t workbuf_data_key_offset;
146         uint32_t workbuf_data_key_size;
147
148         /*
149          * Offset and size of firmware preamble in work buffer.  Size is 0 if
150          * preamble is not stored in the work buffer.
151          */
152         uint32_t workbuf_preamble_offset;
153         uint32_t workbuf_preamble_size;
154
155         /*
156          * Offset and size of hash context in work buffer.  Size is 0 if
157          * hash context is not stored in the work buffer.
158          */
159         uint32_t workbuf_hash_offset;
160         uint32_t workbuf_hash_size;
161
162         /*
163          * Current tag we're hashing
164          *
165          * For new structs, this is the offset of the vb2_signature struct
166          * in the work buffer.
167          *
168          * TODO: rename to workbuf_hash_sig_offset when vboot1 structs are
169          * deprecated.
170          */
171         uint32_t hash_tag;
172
173         /* Amount of data we still expect to hash */
174         uint32_t hash_remaining_size;
175
176         /**********************************************************************
177          * Temporary variables used during kernel verification.  These don't
178          * really need to persist through to the OS, but there's nowhere else
179          * we can put them.
180          *
181          * TODO: make a union with the firmware verification temp variables,
182          * or make both of them workbuf-allocated sub-structs, so that we can
183          * overlap them so kernel variables don't bloat firmware verification
184          * stage memory requirements.
185          */
186
187         /*
188          * Offset and size of packed kernel key in work buffer.  Size is 0 if
189          * subkey is not stored in the work buffer.  Note that kernel key may
190          * be inside the firmware preamble.
191          */
192         uint32_t workbuf_kernel_key_offset;
193         uint32_t workbuf_kernel_key_size;
194
195 } __attribute__((packed));
196
197 /****************************************************************************/
198
199 /* Signature at start of the GBB
200  * Note that if you compile in the signature as is, you are likely to break any
201  * tools that search for the signature. */
202 #define VB2_GBB_SIGNATURE "$GBB"
203 #define VB2_GBB_SIGNATURE_SIZE 4
204 #define VB2_GBB_XOR_CHARS "****"
205 /* TODO: can we write a macro to produce this at compile time? */
206 #define VB2_GBB_XOR_SIGNATURE { 0x0e, 0x6d, 0x68, 0x68 }
207
208 /* VB2 GBB struct version */
209 #define VB2_GBB_MAJOR_VER      1
210 #define VB2_GBB_MINOR_VER      2
211 /* v1.2 - added fields for sha256 digest of the HWID */
212
213 /* Flags for vb2_gbb_header.flags */
214 enum vb2_gbb_flag {
215         /*
216          * Reduce the dev screen delay to 2 sec from 30 sec to speed up
217          * factory.
218          */
219         VB2_GBB_FLAG_DEV_SCREEN_SHORT_DELAY = (1 << 0),
220
221         /*
222          * BIOS should load option ROMs from arbitrary PCI devices. We'll never
223          * enable this ourselves because it executes non-verified code, but if
224          * a customer wants to void their warranty and set this flag in the
225          * read-only flash, they should be able to do so.
226          *
227          * (TODO: Currently not supported. Mark as deprecated/unused?)
228          */
229         VB2_GBB_FLAG_LOAD_OPTION_ROMS = (1 << 1),
230
231         /*
232          * The factory flow may need the BIOS to boot a non-ChromeOS kernel if
233          * the dev-switch is on. This flag allows that.
234          *
235          * (TODO: Currently not supported. Mark as deprecated/unused?)
236          */
237         VB2_GBB_FLAG_ENABLE_ALTERNATE_OS = (1 << 2),
238
239         /*
240          * Force dev switch on, regardless of physical/keyboard dev switch
241          * position.
242          */
243         VB2_GBB_FLAG_FORCE_DEV_SWITCH_ON = (1 << 3),
244
245         /* Allow booting from USB in dev mode even if dev_boot_usb=0. */
246         VB2_GBB_FLAG_FORCE_DEV_BOOT_USB = (1 << 4),
247
248         /* Disable firmware rollback protection. */
249         VB2_GBB_FLAG_DISABLE_FW_ROLLBACK_CHECK = (1 << 5),
250
251         /* Allow Enter key to trigger dev->tonorm screen transition */
252         VB2_GBB_FLAG_ENTER_TRIGGERS_TONORM = (1 << 6),
253
254         /* Allow booting Legacy OSes in dev mode even if dev_boot_legacy=0. */
255         VB2_GBB_FLAG_FORCE_DEV_BOOT_LEGACY = (1 << 7),
256
257         /* Allow booting using alternate keys for FAFT servo testing */
258         VB2_GBB_FLAG_FAFT_KEY_OVERIDE = (1 << 8),
259
260         /* Disable EC software sync */
261         VB2_GBB_FLAG_DISABLE_EC_SOFTWARE_SYNC = (1 << 9),
262
263         /* Default to booting legacy OS when dev screen times out */
264         VB2_GBB_FLAG_DEFAULT_DEV_BOOT_LEGACY = (1 << 10),
265
266         /* Disable PD software sync */
267         VB2_GBB_FLAG_DISABLE_PD_SOFTWARE_SYNC = (1 << 11),
268
269         /* Disable shutdown on lid closed */
270         VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN = (1 << 12),
271
272         /*
273          * Allow full fastboot capability in firmware even if
274          * dev_boot_fastboot_full_cap=0.
275          */
276         VB2_GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP = (1 << 13),
277
278         /* Enable serial */
279         VB2_GBB_FLAG_ENABLE_SERIAL = (1 << 14),
280 };
281
282 struct vb2_gbb_header {
283         /* Fields present in version 1.1 */
284         uint8_t  signature[VB2_GBB_SIGNATURE_SIZE]; /* VB2_GBB_SIGNATURE */
285         uint16_t major_version;   /* See VB2_GBB_MAJOR_VER */
286         uint16_t minor_version;   /* See VB2_GBB_MINOR_VER */
287         uint32_t header_size;     /* Size of GBB header in bytes */
288         uint32_t flags;           /* Flags (see enum vb2_gbb_flag) */
289
290         /* Offsets (from start of header) and sizes (in bytes) of components */
291         uint32_t hwid_offset;           /* HWID */
292         uint32_t hwid_size;
293         uint32_t rootkey_offset;        /* Root key */
294         uint32_t rootkey_size;
295         uint32_t bmpfv_offset;          /* BMP FV */
296         uint32_t bmpfv_size;
297         uint32_t recovery_key_offset;   /* Recovery key */
298         uint32_t recovery_key_size;
299
300         /* Added in version 1.2 */
301         uint8_t  hwid_digest[VB2_GBB_HWID_DIGEST_SIZE]; /* SHA-256 of HWID */
302
303         /* Pad to match EXPECETED_VB2_GBB_HEADER_SIZE.  Initialize to 0. */
304         uint8_t  pad[48];
305 } __attribute__((packed));
306
307 /* The GBB is used outside of vboot_reference, so this size is important. */
308 #define EXPECTED_VB2_GBB_HEADER_SIZE 128
309
310 /*
311  * Root key hash for Ryu devices only.  Contains the hash of the root key.
312  * This will be embedded somewhere inside the RO part of the firmware, so that
313  * it can verify the GBB contains only the official root key.
314  */
315
316 #define RYU_ROOT_KEY_HASH_MAGIC "RtKyHash"
317 #define RYU_ROOT_KEY_HASH_MAGIC_INVCASE "rTkYhASH"
318 #define RYU_ROOT_KEY_HASH_MAGIC_SIZE 8
319
320 #define RYU_ROOT_KEY_HASH_VERSION_MAJOR 1
321 #define RYU_ROOT_KEY_HASH_VERSION_MINOR 0
322
323 struct vb2_ryu_root_key_hash {
324         /* Magic number (RYU_ROOT_KEY_HASH_MAGIC) */
325         uint8_t magic[RYU_ROOT_KEY_HASH_MAGIC_SIZE];
326
327         /* Version of this struct */
328         uint16_t header_version_major;
329         uint16_t header_version_minor;
330
331         /*
332          * Length of this struct, in bytes, including any variable length data
333          * which follows (there is none, yet).
334          */
335         uint32_t struct_size;
336
337         /*
338          * SHA-256 hash digest of the entire root key section from the GBB.  If
339          * all 0 bytes, all root keys will be treated as if matching.
340          */
341         uint8_t root_key_hash_digest[32];
342 };
343
344 #define EXPECTED_VB2_RYU_ROOT_KEY_HASH_SIZE 48
345