crypto: get sha256 support to build.
[akaros.git] / kern / include / crypto / 2secdata.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  * Secure non-volatile storage routines
6  */
7
8 #pragma once
9
10 /*****************************************************************************/
11 /* Firmware version space */
12
13 /* Expected value of vb2_secdata.version */
14 #define VB2_SECDATA_VERSION 2
15
16 /* Flags for firmware space */
17 enum vb2_secdata_flags {
18         /*
19          * Last boot was developer mode.  TPM ownership is cleared when
20          * transitioning to/from developer mode.  Set/cleared by
21          * vb2_check_dev_switch().
22          */
23         VB2_SECDATA_FLAG_LAST_BOOT_DEVELOPER = (1 << 0),
24
25         /*
26          * Virtual developer mode switch is on.  Set/cleared by the
27          * keyboard-controlled dev screens in recovery mode.  Cleared by
28          * vb2_check_dev_switch().
29          */
30         VB2_SECDATA_FLAG_DEV_MODE = (1 << 1),
31 };
32
33 /* Secure data area (firmware space) */
34 struct vb2_secdata {
35         /* Struct version, for backwards compatibility */
36         uint8_t struct_version;
37
38         /* Flags; see vb2_secdata_flags */
39         uint8_t flags;
40
41         /* Firmware versions */
42         uint32_t fw_versions;
43
44         /* Reserved for future expansion */
45         uint8_t reserved[3];
46
47         /* CRC; must be last field in struct */
48         uint8_t crc8;
49 } __attribute__((packed));
50
51 /* Which param to get/set for vb2_secdata_get() / vb2_secdata_set() */
52 enum vb2_secdata_param {
53         /* Flags; see vb2_secdata_flags */
54         VB2_SECDATA_FLAGS = 0,
55
56         /* Firmware versions */
57         VB2_SECDATA_VERSIONS,
58 };
59
60 /*****************************************************************************/
61 /* Kernel version space */
62
63 /* Kernel space - KERNEL_NV_INDEX, locked with physical presence. */
64 #define VB2_SECDATAK_VERSION 2
65 #define VB2_SECDATAK_UID 0x4752574c  /* 'GRWL' */
66
67 struct vb2_secdatak {
68         /* Struct version, for backwards compatibility */
69         uint8_t struct_version;
70
71         /* Unique ID to detect space redefinition */
72         uint32_t uid;
73
74         /* Kernel versions */
75         uint32_t kernel_versions;
76
77         /* Reserved for future expansion */
78         uint8_t reserved[3];
79
80         /* CRC; must be last field in struct */
81         uint8_t crc8;
82 } __attribute__((packed));
83
84 /* Which param to get/set for vb2_secdatak_get() / vb2_secdatak_set() */
85 enum vb2_secdatak_param {
86         /* Kernel versions */
87         VB2_SECDATAK_VERSIONS = 0,
88 };
89
90 /*****************************************************************************/
91 /* Firmware version space functions */
92
93 /**
94  * Check the CRC of the secure storage context.
95  *
96  * Use this if reading from secure storage may be flaky, and you want to retry
97  * reading it several times.
98  *
99  * This may be called before vb2_context_init().
100  *
101  * @param ctx           Context pointer
102  * @return VB2_SUCCESS, or non-zero error code if error.
103  */
104 int vb2_secdata_check_crc(const struct vb2_context *ctx);
105
106 /**
107  * Create fresh data in the secure storage context.
108  *
109  * Use this only when initializing the secure storage context on a new machine
110  * the first time it boots.  Do NOT simply use this if vb2_secdata_check_crc()
111  * (or any other API in this library) fails; that could allow the secure data
112  * to be rolled back to an insecure state.
113  *
114  * This may be called before vb2_context_init().
115  */
116 int vb2_secdata_create(struct vb2_context *ctx);
117
118 /**
119  * Initialize the secure storage context and verify its CRC.
120  *
121  * This must be called before vb2_secdata_get() or vb2_secdata_set().
122  *
123  * @param ctx           Context pointer
124  * @return VB2_SUCCESS, or non-zero error code if error.
125  */
126 int vb2_secdata_init(struct vb2_context *ctx);
127
128 /**
129  * Read a secure storage value.
130  *
131  * @param ctx           Context pointer
132  * @param param         Parameter to read
133  * @param dest          Destination for value
134  * @return VB2_SUCCESS, or non-zero error code if error.
135  */
136 int vb2_secdata_get(struct vb2_context *ctx,
137                     enum vb2_secdata_param param,
138                     uint32_t *dest);
139
140 /**
141  * Write a secure storage value.
142  *
143  * @param ctx           Context pointer
144  * @param param         Parameter to write
145  * @param value         New value
146  * @return VB2_SUCCESS, or non-zero error code if error.
147  */
148 int vb2_secdata_set(struct vb2_context *ctx,
149                     enum vb2_secdata_param param,
150                     uint32_t value);
151
152 /*****************************************************************************/
153 /* Kernel version space functions.
154  *
155  * These are separate functions so that they don't bloat the size of the early
156  * boot code which uses the firmware version space functions.
157  */
158
159 /**
160  * Check the CRC of the kernel version secure storage context.
161  *
162  * Use this if reading from secure storage may be flaky, and you want to retry
163  * reading it several times.
164  *
165  * This may be called before vb2_context_init().
166  *
167  * @param ctx           Context pointer
168  * @return VB2_SUCCESS, or non-zero error code if error.
169  */
170 int vb2_secdatak_check_crc(const struct vb2_context *ctx);
171
172 /**
173  * Create fresh data in the secure storage context.
174  *
175  * Use this only when initializing the secure storage context on a new machine
176  * the first time it boots.  Do NOT simply use this if vb2_secdatak_check_crc()
177  * (or any other API in this library) fails; that could allow the secure data
178  * to be rolled back to an insecure state.
179  *
180  * This may be called before vb2_context_init().
181  */
182 int vb2_secdatak_create(struct vb2_context *ctx);
183
184 /**
185  * Initialize the secure storage context and verify its CRC.
186  *
187  * This must be called before vb2_secdatak_get() or vb2_secdatak_set().
188  *
189  * @param ctx           Context pointer
190  * @return VB2_SUCCESS, or non-zero error code if error.
191  */
192 int vb2_secdatak_init(struct vb2_context *ctx);
193
194 /**
195  * Read a secure storage value.
196  *
197  * @param ctx           Context pointer
198  * @param param         Parameter to read
199  * @param dest          Destination for value
200  * @return VB2_SUCCESS, or non-zero error code if error.
201  */
202 int vb2_secdatak_get(struct vb2_context *ctx,
203                      enum vb2_secdatak_param param,
204                      uint32_t *dest);
205
206 /**
207  * Write a secure storage value.
208  *
209  * @param ctx           Context pointer
210  * @param param         Parameter to write
211  * @param value         New value
212  * @return VB2_SUCCESS, or non-zero error code if error.
213  */
214 int vb2_secdatak_set(struct vb2_context *ctx,
215                      enum vb2_secdatak_param param,
216                      uint32_t value);
217