Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(111)

Side by Side Diff: src/platform/vboot_reference/vkernel/kernel_image_fw.c

Issue 2234003: Change kernel vboot header layout and add support for separate header verification. (Closed) Base URL: ssh://git@gitrw.chromium.org/chromiumos
Patch Set: add verifykernelheader(). rename old function to verifykernelkeyheader(). Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/platform/vboot_reference/vkernel/kernel_image.c ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 /* Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be 2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file. 3 * found in the LICENSE file.
4 * 4 *
5 * Functions for verifying a verified boot kernel image. 5 * Functions for verifying a verified boot kernel image.
6 * (Firmware portion) 6 * (Firmware portion)
7 */ 7 */
8 8
9 #include "kernel_image_fw.h" 9 #include "kernel_image_fw.h"
10 10
11 #include "cryptolib.h" 11 #include "cryptolib.h"
12 #include "rollback_index.h" 12 #include "rollback_index.h"
13 #include "utility.h" 13 #include "utility.h"
14 14
15 /* Macro to determine the size of a field structure in the KernelImage 15 /* Macro to determine the size of a field structure in the KernelImage
16 * structure. */ 16 * structure. */
17 #define FIELD_LEN(field) (sizeof(((KernelImage*)0)->field)) 17 #define FIELD_LEN(field) (sizeof(((KernelImage*)0)->field))
18 18
19 char* kVerifyKernelErrors[VERIFY_KERNEL_MAX] = { 19 char* kVerifyKernelErrors[VERIFY_KERNEL_MAX] = {
20 "Success.", 20 "Success.",
21 "Invalid Image.", 21 "Invalid Image.",
22 "Kernel Key Signature Failed.", 22 "Kernel Key Signature Failed.",
23 "Invalid Kernel Verification Algorithm.", 23 "Invalid Kernel Verification Algorithm.",
24 "Config Signature Failed.", 24 "Preamble Signature Failed.",
25 "Kernel Signature Failed.", 25 "Kernel Signature Failed.",
26 "Wrong Kernel Magic.", 26 "Wrong Kernel Magic.",
27 }; 27 };
28 28
29 inline uint64_t GetKernelPreambleLen(void) {
30 return (FIELD_LEN(kernel_version) +
31 FIELD_LEN(kernel_len) +
32 FIELD_LEN(bootloader_offset) +
33 FIELD_LEN(bootloader_size) +
34 FIELD_LEN(padded_header_size));
35 }
36
29 uint64_t GetVblockHeaderSize(const uint8_t* vkernel_blob) { 37 uint64_t GetVblockHeaderSize(const uint8_t* vkernel_blob) {
30 uint64_t len = 0; 38 uint64_t len = 0;
31 uint16_t firmware_sign_algorithm; 39 uint16_t firmware_sign_algorithm;
32 uint16_t kernel_sign_algorithm; 40 uint16_t kernel_sign_algorithm;
33 int algorithms_offset = (FIELD_LEN(magic) + 41 int algorithms_offset = (FIELD_LEN(magic) +
34 FIELD_LEN(header_version) + 42 FIELD_LEN(header_version) +
35 FIELD_LEN(header_len)); 43 FIELD_LEN(header_len));
36 if (SafeMemcmp(vkernel_blob, KERNEL_MAGIC, KERNEL_MAGIC_SIZE)) { 44 if (SafeMemcmp(vkernel_blob, KERNEL_MAGIC, KERNEL_MAGIC_SIZE)) {
37 debug("Not a valid verified boot kernel blob.\n"); 45 debug("Not a valid verified boot kernel blob.\n");
38 return 0; 46 return 0;
(...skipping 12 matching lines...) Expand all
51 debug("Invalid kernel signing algorithm.\n"); 59 debug("Invalid kernel signing algorithm.\n");
52 return 0; 60 return 0;
53 } 61 }
54 len = algorithms_offset; /* magic, header length and version. */ 62 len = algorithms_offset; /* magic, header length and version. */
55 len += (FIELD_LEN(firmware_sign_algorithm) + 63 len += (FIELD_LEN(firmware_sign_algorithm) +
56 FIELD_LEN(kernel_sign_algorithm) + 64 FIELD_LEN(kernel_sign_algorithm) +
57 FIELD_LEN(kernel_key_version) + 65 FIELD_LEN(kernel_key_version) +
58 RSAProcessedKeySize(kernel_sign_algorithm) + /* kernel_sign_key */ 66 RSAProcessedKeySize(kernel_sign_algorithm) + /* kernel_sign_key */
59 FIELD_LEN(header_checksum) + 67 FIELD_LEN(header_checksum) +
60 siglen_map[firmware_sign_algorithm] + /* kernel_key_signature */ 68 siglen_map[firmware_sign_algorithm] + /* kernel_key_signature */
61 FIELD_LEN(kernel_version) + 69 GetKernelPreambleLen() +
62 FIELD_LEN(kernel_len) + 70 siglen_map[kernel_sign_algorithm] + /* preamble_signature */
63 siglen_map[kernel_sign_algorithm] + /* config_signature */
64 siglen_map[kernel_sign_algorithm]); /* kernel_signature */ 71 siglen_map[kernel_sign_algorithm]); /* kernel_signature */
65 return len; 72 return len;
66 } 73 }
67 74
68 int VerifyKernelHeader(const uint8_t* firmware_key_blob, 75 int VerifyKernelKeyHeader(const uint8_t* firmware_key_blob,
69 const uint8_t* header_blob, 76 const uint8_t* header_blob,
70 const int dev_mode, 77 const int dev_mode,
71 int* firmware_algorithm, 78 int* firmware_algorithm,
72 int* kernel_algorithm, 79 int* kernel_algorithm,
73 int* kernel_header_len) { 80 int* kernel_header_len) {
74 int kernel_sign_key_len; 81 int kernel_sign_key_len;
75 int firmware_sign_key_len; 82 int firmware_sign_key_len;
76 uint16_t header_version, header_len; 83 uint16_t header_version, header_len;
77 uint16_t firmware_sign_algorithm, kernel_sign_algorithm; 84 uint16_t firmware_sign_algorithm, kernel_sign_algorithm;
78 uint8_t* header_checksum = NULL; 85 uint8_t* header_checksum = NULL;
79 86
80 /* Base Offset for the header_checksum field. Actual offset is 87 /* Base Offset for the header_checksum field. Actual offset is
81 * this + kernel_sign_key_len. */ 88 * this + kernel_sign_key_len. */
82 int base_header_checksum_offset = (FIELD_LEN(header_version) + 89 int base_header_checksum_offset = (FIELD_LEN(header_version) +
83 FIELD_LEN(header_len) + 90 FIELD_LEN(header_len) +
(...skipping 24 matching lines...) Expand all
108 *firmware_algorithm = (int) firmware_sign_algorithm; 115 *firmware_algorithm = (int) firmware_sign_algorithm;
109 *kernel_algorithm = (int) kernel_sign_algorithm; 116 *kernel_algorithm = (int) kernel_sign_algorithm;
110 kernel_sign_key_len = RSAProcessedKeySize(kernel_sign_algorithm); 117 kernel_sign_key_len = RSAProcessedKeySize(kernel_sign_algorithm);
111 firmware_sign_key_len = RSAProcessedKeySize(firmware_sign_algorithm); 118 firmware_sign_key_len = RSAProcessedKeySize(firmware_sign_algorithm);
112 119
113 120
114 /* Verify if header len is correct? */ 121 /* Verify if header len is correct? */
115 if (header_len != (base_header_checksum_offset + 122 if (header_len != (base_header_checksum_offset +
116 kernel_sign_key_len + 123 kernel_sign_key_len +
117 FIELD_LEN(header_checksum))) { 124 FIELD_LEN(header_checksum))) {
118 debug("VerifyKernelHeader: Header length mismatch\n"); 125 debug("VerifyKernelKeyHeader: Header length mismatch\n");
119 return VERIFY_KERNEL_INVALID_IMAGE; 126 return VERIFY_KERNEL_INVALID_IMAGE;
120 } 127 }
121 *kernel_header_len = (int) header_len; 128 *kernel_header_len = (int) header_len;
122 129
123 /* Verify if the hash of the header is correct. */ 130 /* Verify if the hash of the header is correct. */
124 header_checksum = DigestBuf(header_blob, 131 header_checksum = DigestBuf(header_blob,
125 header_len - FIELD_LEN(header_checksum), 132 header_len - FIELD_LEN(header_checksum),
126 SHA512_DIGEST_ALGORITHM); 133 SHA512_DIGEST_ALGORITHM);
127 if (SafeMemcmp(header_checksum, 134 if (SafeMemcmp(header_checksum,
128 header_blob + (base_header_checksum_offset + 135 header_blob + (base_header_checksum_offset +
129 kernel_sign_key_len), 136 kernel_sign_key_len),
130 FIELD_LEN(header_checksum))) { 137 FIELD_LEN(header_checksum))) {
131 Free(header_checksum); 138 Free(header_checksum);
132 debug("VerifyKernelHeader: Invalid header hash\n"); 139 debug("VerifyKernelKeyHeader: Invalid header hash\n");
133 return VERIFY_KERNEL_INVALID_IMAGE; 140 return VERIFY_KERNEL_INVALID_IMAGE;
134 } 141 }
135 Free(header_checksum); 142 Free(header_checksum);
136 143
137 /* Verify kernel key signature unless we are in dev mode. */ 144 /* Verify kernel key signature unless we are in dev mode. */
138 if (!dev_mode) { 145 if (!dev_mode) {
139 if (!RSAVerifyBinary_f(firmware_key_blob, NULL, /* Key to use */ 146 if (!RSAVerifyBinary_f(firmware_key_blob, NULL, /* Key to use */
140 header_blob, /* Data to verify */ 147 header_blob, /* Data to verify */
141 header_len, /* Length of data */ 148 header_len, /* Length of data */
142 header_blob + header_len, /* Expected Signature */ 149 header_blob + header_len, /* Expected Signature */
143 firmware_sign_algorithm)) 150 firmware_sign_algorithm))
144 return VERIFY_KERNEL_KEY_SIGNATURE_FAILED; 151 return VERIFY_KERNEL_KEY_SIGNATURE_FAILED;
145 } 152 }
146 return 0; 153 return 0;
147 } 154 }
148 155
149 int VerifyKernelConfig(RSAPublicKey* kernel_sign_key, 156 int VerifyKernelPreamble(RSAPublicKey* kernel_sign_key,
150 const uint8_t* config_blob, 157 const uint8_t* preamble_blob,
151 int algorithm, 158 int algorithm,
152 uint64_t* kernel_len) { 159 uint64_t* kernel_len) {
153 int signature_len = siglen_map[algorithm]; 160 int preamble_len = GetKernelPreambleLen();
154 const uint8_t* config_signature = NULL; 161 if (!RSAVerifyBinary_f(NULL, kernel_sign_key, /* Key to use */
155 const uint8_t* kernel_config = NULL; 162 preamble_blob, /* Data to verify */
156 uint8_t* digest = NULL; 163 preamble_len, /* Length of data */
157 DigestContext ctx; 164 preamble_blob + preamble_len, /* Expected Signature */
158 165 algorithm))
159 config_signature = config_blob + (FIELD_LEN(kernel_version) + 166 return VERIFY_KERNEL_PREAMBLE_SIGNATURE_FAILED;
160 FIELD_LEN(kernel_len));
161 kernel_config = config_signature + 2 * signature_len; /* kernel and config
162 * signature. */
163 /* Since the kernel config signature is computed over the kernel version,
164 * kernel length and config, which does not form a contiguous region memory,
165 * we calculate the message digest ourselves. */
166 DigestInit(&ctx, algorithm);
167 DigestUpdate(&ctx,
168 config_blob,
169 FIELD_LEN(kernel_version) + FIELD_LEN(kernel_len));
170 DigestUpdate(&ctx,
171 kernel_config,
172 FIELD_LEN(kernel_config));
173 digest = DigestFinal(&ctx);
174 if (!RSAVerifyBinaryWithDigest_f(
175 NULL, kernel_sign_key, /* Key to use. */
176 digest, /* Digest of the Data to verify. */
177 config_signature, /* Expected signature. */
178 algorithm)) {
179 Free(digest);
180 return VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED;
181 }
182 Free(digest);
183 Memcpy(kernel_len, 167 Memcpy(kernel_len,
184 config_blob + FIELD_LEN(kernel_version), 168 preamble_blob + FIELD_LEN(kernel_version),
185 FIELD_LEN(kernel_len)); 169 FIELD_LEN(kernel_len));
186 return 0; 170 return 0;
187 } 171 }
188 172
189 int VerifyKernelData(RSAPublicKey* kernel_sign_key, 173 int VerifyKernelData(RSAPublicKey* kernel_sign_key,
190 const uint8_t* config_blob, 174 const uint8_t* preamble_blob,
191 const uint8_t* kernel_data, 175 const uint8_t* kernel_data,
192 uint64_t kernel_len, 176 uint64_t kernel_len,
193 int algorithm) { 177 int algorithm) {
194 int signature_len = siglen_map[algorithm]; 178 int signature_len = siglen_map[algorithm];
195 const uint8_t* kernel_signature = NULL; 179 const uint8_t* kernel_signature = NULL;
196 const uint8_t* kernel_config = NULL;
197 uint8_t* digest = NULL; 180 uint8_t* digest = NULL;
198 DigestContext ctx; 181 DigestContext ctx;
199 182
200 kernel_signature = config_blob + (FIELD_LEN(kernel_version) + 183 kernel_signature = preamble_blob + (GetKernelPreambleLen() +
201 FIELD_LEN(kernel_len) + 184 signature_len);
202 signature_len);
203 kernel_config = kernel_signature + signature_len;
204 185
205 /* Since the kernel signature is computed over the kernel version, length, 186 /* Since the kernel signature is computed over the kernel preamble
206 * config cmd line, and kernel image data, which does not form a contiguous 187 * and kernel image data, which does not form a contiguous
207 * region of memory, we calculate the message digest ourselves. */ 188 * region of memory, we calculate the message digest ourselves. */
208 DigestInit(&ctx, algorithm); 189 DigestInit(&ctx, algorithm);
209 DigestUpdate(&ctx, 190 DigestUpdate(&ctx,
210 config_blob, 191 preamble_blob,
211 FIELD_LEN(kernel_version) + FIELD_LEN(kernel_len)); 192 GetKernelPreambleLen());
212 DigestUpdate(&ctx, kernel_config,
213 FIELD_LEN(kernel_config));
214 DigestUpdate(&ctx, kernel_data, kernel_len); 193 DigestUpdate(&ctx, kernel_data, kernel_len);
215 digest = DigestFinal(&ctx); 194 digest = DigestFinal(&ctx);
216 if (!RSAVerifyBinaryWithDigest_f( 195 if (!RSAVerifyBinaryWithDigest_f(
217 NULL, kernel_sign_key, /* Key to use. */ 196 NULL, kernel_sign_key, /* Key to use. */
218 digest, /* Digest of the data to verify. */ 197 digest, /* Digest of the data to verify. */
219 kernel_signature, /* Expected Signature */ 198 kernel_signature, /* Expected Signature */
220 algorithm)) { 199 algorithm)) {
221 Free(digest); 200 Free(digest);
222 return VERIFY_KERNEL_SIGNATURE_FAILED; 201 return VERIFY_KERNEL_SIGNATURE_FAILED;
223 } 202 }
224 Free(digest); 203 Free(digest);
225 return 0; 204 return 0;
226 } 205 }
227 206
207 int VerifyKernelHeader(const uint8_t* firmware_key_blob,
208 const uint8_t* kernel_header_blob,
209 const int dev_mode,
210 const uint8_t** preamble_blob,
211 const uint8_t** expected_kernel_signature,
212 RSAPublicKey** kernel_sign_key,
213 int* kernel_sign_algorithm,
214 uint64_t* kernel_len) {
215 int error_code;
216 int firmware_sign_algorithm; /* Firmware signing key algorithm. */
217 int kernel_sign_key_len, kernel_key_signature_len, kernel_signature_len,
218 header_len;
219 const uint8_t* header_ptr; /* Pointer to header. */
220 const uint8_t* kernel_sign_key_ptr; /* Pointer to signing key. */
221
222 /* Note: All the offset calculations are based on struct FirmwareImage which
Randall Spangler 2010/05/26 16:35:23 KernelImage
223 * is defined in include/firmware_image.h. */
224
225 /* Compare magic bytes. */
226 if (SafeMemcmp(kernel_header_blob, KERNEL_MAGIC, KERNEL_MAGIC_SIZE))
227 return VERIFY_KERNEL_WRONG_MAGIC;
228 header_ptr = kernel_header_blob + KERNEL_MAGIC_SIZE;
229
230 /* Only continue if header verification succeeds. */
231 if ((error_code = VerifyKernelKeyHeader(firmware_key_blob, header_ptr,
232 dev_mode,
233 &firmware_sign_algorithm,
234 kernel_sign_algorithm,
235 &header_len))) {
236 debug("VerifyKernelHeader: Kernel Key Header verification failed.\n");
237 return error_code; /* AKA jump to recovery. */
238 }
239 /* Parse signing key into RSAPublicKey structure since it is required multiple
240 * times. */
241 kernel_sign_key_len = RSAProcessedKeySize(*kernel_sign_algorithm);
242 kernel_sign_key_ptr = header_ptr + (FIELD_LEN(header_version) +
243 FIELD_LEN(header_len) +
244 FIELD_LEN(firmware_sign_algorithm) +
245 FIELD_LEN(kernel_sign_algorithm) +
246 FIELD_LEN(kernel_key_version));
247 *kernel_sign_key = RSAPublicKeyFromBuf(kernel_sign_key_ptr,
248 kernel_sign_key_len);
249 kernel_signature_len = siglen_map[*kernel_sign_algorithm];
250 kernel_key_signature_len = siglen_map[firmware_sign_algorithm];
251
252 /* Only continue if preamble verification succeeds. */
253 *preamble_blob = (header_ptr + header_len + kernel_key_signature_len);
254 if ((error_code = VerifyKernelPreamble(*kernel_sign_key, *preamble_blob,
255 *kernel_sign_algorithm,
256 kernel_len))) {
257 RSAPublicKeyFree(*kernel_sign_key);
258 return error_code; /* AKA jump to recovery. */
259 }
260 *expected_kernel_signature = (*preamble_blob +
261 GetKernelPreambleLen() +
262 kernel_signature_len); /* Skip preamble. */
263 return 0;
264 }
265
228 int VerifyKernel(const uint8_t* firmware_key_blob, 266 int VerifyKernel(const uint8_t* firmware_key_blob,
229 const uint8_t* kernel_blob, 267 const uint8_t* kernel_blob,
230 const int dev_mode) { 268 const int dev_mode) {
231 int error_code; 269 int error_code;
232 int firmware_sign_algorithm; /* Firmware signing key algorithm. */ 270 int firmware_sign_algorithm; /* Firmware signing key algorithm. */
233 int kernel_sign_algorithm; /* Kernel Signing key algorithm. */ 271 int kernel_sign_algorithm; /* Kernel Signing key algorithm. */
234 RSAPublicKey* kernel_sign_key; 272 RSAPublicKey* kernel_sign_key;
235 int kernel_sign_key_len, kernel_key_signature_len, kernel_signature_len, 273 int kernel_sign_key_len, kernel_key_signature_len, kernel_signature_len,
236 header_len; 274 header_len;
237 uint64_t kernel_len; 275 uint64_t kernel_len;
238 const uint8_t* header_ptr; /* Pointer to header. */ 276 const uint8_t* header_ptr; /* Pointer to header. */
239 const uint8_t* kernel_sign_key_ptr; /* Pointer to signing key. */ 277 const uint8_t* kernel_sign_key_ptr; /* Pointer to signing key. */
240 const uint8_t* config_ptr; /* Pointer to kernel config block. */ 278 const uint8_t* preamble_ptr; /* Pointer to kernel preamble block. */
241 const uint8_t* kernel_ptr; /* Pointer to kernel signature/data. */ 279 const uint8_t* kernel_ptr; /* Pointer to kernel signature/data. */
242 280
243 /* Note: All the offset calculations are based on struct FirmwareImage which 281 /* Note: All the offset calculations are based on struct FirmwareImage which
244 * is defined in include/firmware_image.h. */ 282 * is defined in include/firmware_image.h. */
245 283
246 /* Compare magic bytes. */ 284 /* Compare magic bytes. */
247 if (SafeMemcmp(kernel_blob, KERNEL_MAGIC, KERNEL_MAGIC_SIZE)) 285 if (SafeMemcmp(kernel_blob, KERNEL_MAGIC, KERNEL_MAGIC_SIZE))
248 return VERIFY_KERNEL_WRONG_MAGIC; 286 return VERIFY_KERNEL_WRONG_MAGIC;
249 header_ptr = kernel_blob + KERNEL_MAGIC_SIZE; 287 header_ptr = kernel_blob + KERNEL_MAGIC_SIZE;
250 288
251 /* Only continue if header verification succeeds. */ 289 /* Only continue if header verification succeeds. */
252 if ((error_code = VerifyKernelHeader(firmware_key_blob, header_ptr, dev_mode, 290 if ((error_code = VerifyKernelKeyHeader(firmware_key_blob, header_ptr, dev_mod e,
253 &firmware_sign_algorithm, 291 &firmware_sign_algorithm,
254 &kernel_sign_algorithm, &header_len))) { 292 &kernel_sign_algorithm, &header_len))) {
255 debug("VerifyKernel: Kernel header verification failed.\n"); 293 debug("VerifyKernel: Kernel header verification failed.\n");
256 return error_code; /* AKA jump to recovery. */ 294 return error_code; /* AKA jump to recovery. */
257 } 295 }
258 /* Parse signing key into RSAPublicKey structure since it is required multiple 296 /* Parse signing key into RSAPublicKey structure since it is required multiple
259 * times. */ 297 * times. */
260 kernel_sign_key_len = RSAProcessedKeySize(kernel_sign_algorithm); 298 kernel_sign_key_len = RSAProcessedKeySize(kernel_sign_algorithm);
261 kernel_sign_key_ptr = header_ptr + (FIELD_LEN(header_version) + 299 kernel_sign_key_ptr = header_ptr + (FIELD_LEN(header_version) +
262 FIELD_LEN(header_len) + 300 FIELD_LEN(header_len) +
263 FIELD_LEN(firmware_sign_algorithm) + 301 FIELD_LEN(firmware_sign_algorithm) +
264 FIELD_LEN(kernel_sign_algorithm) + 302 FIELD_LEN(kernel_sign_algorithm) +
265 FIELD_LEN(kernel_key_version)); 303 FIELD_LEN(kernel_key_version));
266 kernel_sign_key = RSAPublicKeyFromBuf(kernel_sign_key_ptr, 304 kernel_sign_key = RSAPublicKeyFromBuf(kernel_sign_key_ptr,
267 kernel_sign_key_len); 305 kernel_sign_key_len);
268 kernel_signature_len = siglen_map[kernel_sign_algorithm]; 306 kernel_signature_len = siglen_map[kernel_sign_algorithm];
269 kernel_key_signature_len = siglen_map[firmware_sign_algorithm]; 307 kernel_key_signature_len = siglen_map[firmware_sign_algorithm];
270 308
271 /* Only continue if config verification succeeds. */ 309 /* Only continue if preamble verification succeeds. */
272 config_ptr = (header_ptr + header_len + kernel_key_signature_len); 310 preamble_ptr = (header_ptr + header_len + kernel_key_signature_len);
273 if ((error_code = VerifyKernelConfig(kernel_sign_key, config_ptr, 311 if ((error_code = VerifyKernelPreamble(kernel_sign_key, preamble_ptr,
274 kernel_sign_algorithm, 312 kernel_sign_algorithm,
275 &kernel_len))) { 313 &kernel_len))) {
276 RSAPublicKeyFree(kernel_sign_key); 314 RSAPublicKeyFree(kernel_sign_key);
277 return error_code; /* AKA jump to recovery. */ 315 return error_code; /* AKA jump to recovery. */
278 } 316 }
279 /* Only continue if kernel data verification succeeds. */ 317 /* Only continue if kernel data verification succeeds. */
280 kernel_ptr = (config_ptr + 318 kernel_ptr = (preamble_ptr +
281 FIELD_LEN(kernel_version) + 319 GetKernelPreambleLen() +
282 FIELD_LEN(kernel_len) + 320 2 * kernel_signature_len); /* preamble and kernel signature. */
283 2 * kernel_signature_len + /* config and kernel signature. */
284 FIELD_LEN(kernel_config));
285 321
286 if ((error_code = VerifyKernelData(kernel_sign_key, /* Verification key */ 322 if ((error_code = VerifyKernelData(kernel_sign_key, /* Verification key */
287 config_ptr, /* Start of config block */ 323 preamble_ptr, /* Start of preamble */
288 kernel_ptr, /* Start of kernel image */ 324 kernel_ptr, /* Start of kernel image */
289 kernel_len, /* Length of kernel image. */ 325 kernel_len, /* Length of kernel image. */
290 kernel_sign_algorithm))) { 326 kernel_sign_algorithm))) {
291 RSAPublicKeyFree(kernel_sign_key); 327 RSAPublicKeyFree(kernel_sign_key);
292 return error_code; /* AKA jump to recovery. */ 328 return error_code; /* AKA jump to recovery. */
293 } 329 }
294 RSAPublicKeyFree(kernel_sign_key); 330 RSAPublicKeyFree(kernel_sign_key);
295 return 0; /* Success! */ 331 return 0; /* Success! */
296 } 332 }
297 333
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
426 /* Lock Kernel TPM rollback indices from further writes. 462 /* Lock Kernel TPM rollback indices from further writes.
427 * TODO(gauravsh): Figure out if these can be combined into one 463 * TODO(gauravsh): Figure out if these can be combined into one
428 * 32-bit location since we seem to always use them together. This can help 464 * 32-bit location since we seem to always use them together. This can help
429 * us minimize the number of NVRAM writes/locks (which are limited over flash 465 * us minimize the number of NVRAM writes/locks (which are limited over flash
430 * memory lifetimes. 466 * memory lifetimes.
431 */ 467 */
432 LockStoredVersion(KERNEL_KEY_VERSION); 468 LockStoredVersion(KERNEL_KEY_VERSION);
433 LockStoredVersion(KERNEL_VERSION); 469 LockStoredVersion(KERNEL_VERSION);
434 return kernel_to_boot; 470 return kernel_to_boot;
435 } 471 }
OLDNEW
« no previous file with comments | « src/platform/vboot_reference/vkernel/kernel_image.c ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698