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

Side by Side Diff: src/platform/vboot_reference/vkernel/kernel_image.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, 7 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
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 generating and manipulating a verified boot kernel image. 5 * Functions for generating and manipulating a verified boot kernel image.
6 * (Userland portion) 6 * (Userland portion)
7 */ 7 */
8 8
9 #include "kernel_image.h" 9 #include "kernel_image.h"
10 10
(...skipping 11 matching lines...) Expand all
22 22
23 /* Macro to determine the size of a field structure in the KernelImage 23 /* Macro to determine the size of a field structure in the KernelImage
24 * structure. */ 24 * structure. */
25 #define FIELD_LEN(field) (sizeof(((KernelImage*)0)->field)) 25 #define FIELD_LEN(field) (sizeof(((KernelImage*)0)->field))
26 26
27 KernelImage* KernelImageNew(void) { 27 KernelImage* KernelImageNew(void) {
28 KernelImage* image = (KernelImage*) Malloc(sizeof(KernelImage)); 28 KernelImage* image = (KernelImage*) Malloc(sizeof(KernelImage));
29 if (image) { 29 if (image) {
30 image->kernel_sign_key = NULL; 30 image->kernel_sign_key = NULL;
31 image->kernel_key_signature = NULL; 31 image->kernel_key_signature = NULL;
32 Memset(image->kernel_config, 32 image->preamble_signature = NULL;
33 0,
34 sizeof(image->kernel_config));
35 image->config_signature = NULL;
36 image->kernel_signature = NULL; 33 image->kernel_signature = NULL;
37 image->kernel_data = NULL; 34 image->kernel_data = NULL;
38 } 35 }
39 return image; 36 return image;
40 } 37 }
41 38
42 void KernelImageFree(KernelImage* image) { 39 void KernelImageFree(KernelImage* image) {
43 if (image) { 40 if (image) {
44 Free(image->kernel_sign_key); 41 Free(image->kernel_sign_key);
45 Free(image->kernel_key_signature); 42 Free(image->kernel_key_signature);
46 Free(image->config_signature); 43 Free(image->preamble_signature);
47 Free(image->kernel_signature); 44 Free(image->kernel_signature);
48 Free(image->kernel_data); 45 Free(image->kernel_data);
49 Free(image); 46 Free(image);
50 } 47 }
51 } 48 }
52 49
53 KernelImage* ReadKernelImage(const char* input_file) { 50 KernelImage* ReadKernelImage(const char* input_file) {
54 uint64_t file_size; 51 uint64_t file_size;
55 int image_len = 0; /* Total size of the kernel image. */ 52 int image_len = 0; /* Total size of the kernel image. */
56 int header_len = 0; 53 int header_len = 0;
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 debug("Invalid kernel header checksum!\n"); 126 debug("Invalid kernel header checksum!\n");
130 Free(kernel_buf); 127 Free(kernel_buf);
131 return NULL; 128 return NULL;
132 } 129 }
133 130
134 /* Read key signature. */ 131 /* Read key signature. */
135 image->kernel_key_signature = (uint8_t*) Malloc(kernel_key_signature_len); 132 image->kernel_key_signature = (uint8_t*) Malloc(kernel_key_signature_len);
136 StatefulMemcpy(&st, image->kernel_key_signature, 133 StatefulMemcpy(&st, image->kernel_key_signature,
137 kernel_key_signature_len); 134 kernel_key_signature_len);
138 135
139 /* Read the kernel config. */ 136 /* Read the kernel preamble. */
140 StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version)); 137 StatefulMemcpy(&st, &image->kernel_version, FIELD_LEN(kernel_version));
141 StatefulMemcpy(&st, &image->kernel_len, FIELD_LEN(kernel_len)); 138 StatefulMemcpy(&st, &image->kernel_len, FIELD_LEN(kernel_len));
139 StatefulMemcpy(&st, &image->bootloader_offset, FIELD_LEN(bootloader_offset));
140 StatefulMemcpy(&st, &image->bootloader_size, FIELD_LEN(bootloader_size));
141 StatefulMemcpy(&st, &image->padded_header_size,
142 FIELD_LEN(padded_header_size));
142 143
143 /* Read config and kernel signatures. */ 144 /* Read config and kernel signatures. */
144 image->config_signature = (uint8_t*) Malloc(kernel_signature_len); 145 image->preamble_signature = (uint8_t*) Malloc(kernel_signature_len);
145 StatefulMemcpy(&st, image->config_signature, kernel_signature_len); 146 StatefulMemcpy(&st, image->preamble_signature, kernel_signature_len);
146 image->kernel_signature = (uint8_t*) Malloc(kernel_signature_len); 147 image->kernel_signature = (uint8_t*) Malloc(kernel_signature_len);
147 StatefulMemcpy(&st, image->kernel_signature, kernel_signature_len); 148 StatefulMemcpy(&st, image->kernel_signature, kernel_signature_len);
148 149
149 /* Read kernel config command line and kernel image data. */ 150 /* Read kernel image data. */
150 StatefulMemcpy(&st, image->kernel_config, FIELD_LEN(kernel_config));
151 image->kernel_data = (uint8_t*) Malloc(image->kernel_len); 151 image->kernel_data = (uint8_t*) Malloc(image->kernel_len);
152 StatefulMemcpy(&st, image->kernel_data, image->kernel_len); 152 StatefulMemcpy(&st, image->kernel_data, image->kernel_len);
153 153
154 if(st.overrun || st.remaining_len != 0) { /* Overrun or underrun. */ 154 if(st.overrun || st.remaining_len != 0) { /* Overrun or underrun. */
155 Free(kernel_buf); 155 Free(kernel_buf);
156 return NULL; 156 return NULL;
157 } 157 }
158 Free(kernel_buf); 158 Free(kernel_buf);
159 return image; 159 return image;
160 } 160 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 RSAProcessedKeySize(image->kernel_sign_algorithm)); 211 RSAProcessedKeySize(image->kernel_sign_algorithm));
212 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum)); 212 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum));
213 213
214 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ 214 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */
215 Free(header_blob); 215 Free(header_blob);
216 return NULL; 216 return NULL;
217 } 217 }
218 return header_blob; 218 return header_blob;
219 } 219 }
220 220
221 int GetKernelConfigLen(const KernelImage* image) { 221 uint8_t* GetKernelPreambleBlob(const KernelImage* image) {
222 return (FIELD_LEN(kernel_version) + 222 uint8_t* preamble_blob = NULL;
223 FIELD_LEN(kernel_len) +
224 FIELD_LEN(kernel_config));
225 }
226
227 uint8_t* GetKernelConfigBlob(const KernelImage* image) {
228 uint8_t* config_blob = NULL;
229 MemcpyState st; 223 MemcpyState st;
230 224
231 config_blob = (uint8_t*) Malloc(GetKernelConfigLen(image)); 225 preamble_blob = (uint8_t*) Malloc(GetKernelPreambleLen());
232 st.remaining_len = GetKernelConfigLen(image); 226 st.remaining_len = GetKernelPreambleLen();
233 st.remaining_buf = config_blob; 227 st.remaining_buf = preamble_blob;
234 st.overrun = 0; 228 st.overrun = 0;
235 229
236 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); 230 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version));
237 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len)); 231 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len));
238 StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config)); 232 StatefulMemcpy_r(&st, &image->bootloader_offset, FIELD_LEN(bootloader_offset)) ;
233 StatefulMemcpy_r(&st, &image->bootloader_size, FIELD_LEN(bootloader_size));
234 StatefulMemcpy_r(&st, &image->padded_header_size,
235 FIELD_LEN(padded_header_size));
239 236
240 if (st.overrun || st.remaining_len != 0) { /* Overrun or Underrun. */ 237 if (st.overrun || st.remaining_len != 0) { /* Overrun or Underrun. */
241 Free(config_blob); 238 Free(preamble_blob);
242 return NULL; 239 return NULL;
243 } 240 }
244 return config_blob; 241 return preamble_blob;
245 } 242 }
246 243
247 uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) { 244 uint8_t* GetKernelBlob(const KernelImage* image, uint64_t* blob_len) {
248 int kernel_key_signature_len; 245 int kernel_key_signature_len;
249 int kernel_signature_len; 246 int kernel_signature_len;
250 uint8_t* kernel_blob = NULL; 247 uint8_t* kernel_blob = NULL;
251 uint8_t* header_blob = NULL; 248 uint8_t* header_blob = NULL;
252 MemcpyState st; 249 MemcpyState st;
253 250
254 if (!image) 251 if (!image)
255 return NULL; 252 return NULL;
256 kernel_key_signature_len = siglen_map[image->firmware_sign_algorithm]; 253 kernel_key_signature_len = siglen_map[image->firmware_sign_algorithm];
257 kernel_signature_len = siglen_map[image->kernel_sign_algorithm]; 254 kernel_signature_len = siglen_map[image->kernel_sign_algorithm];
258 *blob_len = (FIELD_LEN(magic) + 255 *blob_len = (FIELD_LEN(magic) +
259 GetKernelHeaderLen(image) + 256 GetKernelHeaderLen(image) +
260 kernel_key_signature_len + 257 kernel_key_signature_len +
261 GetKernelConfigLen(image) + 258 GetKernelPreambleLen() +
262 2 * kernel_signature_len + 259 2 * kernel_signature_len +
263 image->kernel_len); 260 image->kernel_len);
264 kernel_blob = (uint8_t*) Malloc(*blob_len); 261 kernel_blob = (uint8_t*) Malloc(*blob_len);
265 st.remaining_len = *blob_len; 262 st.remaining_len = *blob_len;
266 st.remaining_buf = kernel_blob; 263 st.remaining_buf = kernel_blob;
267 st.overrun = 0; 264 st.overrun = 0;
268 265
269 header_blob = GetKernelHeaderBlob(image); 266 header_blob = GetKernelHeaderBlob(image);
270 267
271 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic)); 268 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic));
272 StatefulMemcpy_r(&st, header_blob, GetKernelHeaderLen(image)); 269 StatefulMemcpy_r(&st, header_blob, GetKernelHeaderLen(image));
273 StatefulMemcpy_r(&st, image->kernel_key_signature, kernel_key_signature_len); 270 StatefulMemcpy_r(&st, image->kernel_key_signature, kernel_key_signature_len);
274 /* Copy over kernel config blob (including signatures.) */ 271 /* Copy over kernel preamble blob (including signatures.) */
275 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version)); 272 StatefulMemcpy_r(&st, &image->kernel_version, FIELD_LEN(kernel_version));
276 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len)); 273 StatefulMemcpy_r(&st, &image->kernel_len, FIELD_LEN(kernel_len));
277 StatefulMemcpy_r(&st, image->config_signature, kernel_signature_len); 274 StatefulMemcpy_r(&st, &image->bootloader_offset,
275 FIELD_LEN(bootloader_offset));
276 StatefulMemcpy_r(&st, &image->bootloader_size, FIELD_LEN(bootloader_size));
277 StatefulMemcpy_r(&st, &image->padded_header_size,
278 FIELD_LEN(padded_header_size));
279 StatefulMemcpy_r(&st, image->preamble_signature, kernel_signature_len);
278 StatefulMemcpy_r(&st, image->kernel_signature, kernel_signature_len); 280 StatefulMemcpy_r(&st, image->kernel_signature, kernel_signature_len);
279 StatefulMemcpy_r(&st, image->kernel_config, FIELD_LEN(kernel_config));
280 StatefulMemcpy_r(&st, image->kernel_data, image->kernel_len); 281 StatefulMemcpy_r(&st, image->kernel_data, image->kernel_len);
281 282
282 Free(header_blob); 283 Free(header_blob);
283 284
284 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */ 285 if (st.overrun || st.remaining_len != 0) { /* Underrun or Overrun. */
285 Free(kernel_blob); 286 Free(kernel_blob);
286 return NULL; 287 return NULL;
287 } 288 }
288 return kernel_blob; 289 return kernel_blob;
289 } 290 }
(...skipping 18 matching lines...) Expand all
308 debug("Couldn't create kernel blob from KernelImage.\n"); 309 debug("Couldn't create kernel blob from KernelImage.\n");
309 return 0; 310 return 0;
310 } 311 }
311 if (!is_only_vblock) { 312 if (!is_only_vblock) {
312 if (blob_len != write(fd, kernel_blob, blob_len)) { 313 if (blob_len != write(fd, kernel_blob, blob_len)) {
313 debug("Couldn't write Kernel Image to file: %s\n", 314 debug("Couldn't write Kernel Image to file: %s\n",
314 input_file); 315 input_file);
315 success = 0; 316 success = 0;
316 } 317 }
317 } else { 318 } else {
318 /* Exclude kernel_config and kernel_data. */ 319 /* Exclude kernel_data. */
319 int vblock_len = blob_len - (image->kernel_len + 320 int vblock_len = blob_len - (image->kernel_len);
320 sizeof(image->kernel_config));
321 if (vblock_len != write(fd, kernel_blob, vblock_len)) { 321 if (vblock_len != write(fd, kernel_blob, vblock_len)) {
322 debug("Couldn't write Kernel Image Verification block to file: %s\n", 322 debug("Couldn't write Kernel Image Verification block to file: %s\n",
323 input_file); 323 input_file);
324 success = 0; 324 success = 0;
325 } 325 }
326 } 326 }
327 Free(kernel_blob); 327 Free(kernel_blob);
328 close(fd); 328 close(fd);
329 return success; 329 return success;
330 } 330 }
331 331
332 void PrintKernelImage(const KernelImage* image) { 332 void PrintKernelImage(const KernelImage* image) {
333 if (!image) 333 if (!image)
334 return; 334 return;
335 335
336 /* Print header. */ 336 /* Print header. */
337 printf("Header Version = %d\n" 337 printf("Header Version = %d\n"
338 "Header Length = %d\n" 338 "Header Length = %d\n"
339 "Kernel Key Signature Algorithm = %s\n" 339 "Kernel Key Signature Algorithm = %s\n"
340 "Kernel Signature Algorithm = %s\n" 340 "Kernel Signature Algorithm = %s\n"
341 "Kernel Key Version = %d\n\n", 341 "Kernel Key Version = %d\n\n",
342 image->header_version, 342 image->header_version,
343 image->header_len, 343 image->header_len,
344 algo_strings[image->firmware_sign_algorithm], 344 algo_strings[image->firmware_sign_algorithm],
345 algo_strings[image->kernel_sign_algorithm], 345 algo_strings[image->kernel_sign_algorithm],
346 image->kernel_key_version); 346 image->kernel_key_version);
347 /* TODO(gauravsh): Output hash and key signature here? */ 347 /* TODO(gauravsh): Output hash and key signature here? */
348 /* Print preamble. */ 348 /* Print preamble. */
349 printf("Kernel Version = %d\n" 349 printf("Kernel Version = %d\n"
350 "Kernel Config command line = \"%s\"\n" 350 "kernel Length = %" PRId64 "\n"
351 "kernel Length = %" PRId64 "\n", 351 "Bootloader Offset = %" PRId64 "\n"
352 "Bootloader Size = %" PRId64 "\n"
353 "Padded Header Size = %" PRId64 "\n",
352 image->kernel_version, 354 image->kernel_version,
353 image->kernel_config, 355 image->kernel_len,
354 image->kernel_len); 356 image->bootloader_offset,
357 image->bootloader_size,
358 image->padded_header_size);
355 /* TODO(gauravsh): Output kernel signature here? */ 359 /* TODO(gauravsh): Output kernel signature here? */
356 } 360 }
357 361
358 362
359 int VerifyKernelImage(const RSAPublicKey* firmware_key, 363 int VerifyKernelImage(const RSAPublicKey* firmware_key,
360 const KernelImage* image, 364 const KernelImage* image,
361 const int dev_mode) { 365 const int dev_mode) {
362 RSAPublicKey* kernel_sign_key = NULL; 366 RSAPublicKey* kernel_sign_key = NULL;
363 uint8_t* header_digest = NULL; 367 uint8_t* header_digest = NULL;
364 uint8_t* config_digest = NULL; 368 uint8_t* preamble_digest = NULL;
365 uint8_t* kernel_digest = NULL; 369 uint8_t* kernel_digest = NULL;
366 int kernel_sign_key_size; 370 int kernel_sign_key_size;
367 int kernel_signature_size; 371 int kernel_signature_size;
368 int error_code = 0; 372 int error_code = 0;
369 DigestContext ctx; 373 DigestContext ctx;
370 DigestContext kernel_ctx; 374 DigestContext kernel_ctx;
371 if (!image) 375 if (!image)
372 return VERIFY_KERNEL_INVALID_IMAGE; 376 return VERIFY_KERNEL_INVALID_IMAGE;
373 377
374 /* Verify kernel key signature on the key header if we 378 /* Verify kernel key signature on the key header if we
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 goto verify_failure; 414 goto verify_failure;
411 } 415 }
412 } 416 }
413 417
414 /* Get kernel signing key to verify the rest of the kernel. */ 418 /* Get kernel signing key to verify the rest of the kernel. */
415 kernel_sign_key_size = RSAProcessedKeySize(image->kernel_sign_algorithm); 419 kernel_sign_key_size = RSAProcessedKeySize(image->kernel_sign_algorithm);
416 kernel_sign_key = RSAPublicKeyFromBuf(image->kernel_sign_key, 420 kernel_sign_key = RSAPublicKeyFromBuf(image->kernel_sign_key,
417 kernel_sign_key_size); 421 kernel_sign_key_size);
418 kernel_signature_size = siglen_map[image->kernel_sign_algorithm]; 422 kernel_signature_size = siglen_map[image->kernel_sign_algorithm];
419 423
420 /* Verify kernel config signature. */ 424 /* Verify kernel preamble signature. */
421 DigestInit(&ctx, image->kernel_sign_algorithm); 425 DigestInit(&ctx, image->kernel_sign_algorithm);
422 DigestUpdate(&ctx, (uint8_t*) &image->kernel_version, 426 DigestUpdate(&ctx, (uint8_t*) &image->kernel_version,
423 FIELD_LEN(kernel_version)); 427 FIELD_LEN(kernel_version));
424 DigestUpdate(&ctx, (uint8_t*) &image->kernel_len, 428 DigestUpdate(&ctx, (uint8_t*) &image->kernel_len,
425 FIELD_LEN(kernel_len)); 429 FIELD_LEN(kernel_len));
426 DigestUpdate(&ctx, (uint8_t*) image->kernel_config, 430 DigestUpdate(&ctx, (uint8_t*) &image->bootloader_offset,
427 FIELD_LEN(kernel_config)); 431 FIELD_LEN(bootloader_offset));
428 config_digest = DigestFinal(&ctx); 432 DigestUpdate(&ctx, (uint8_t*) &image->bootloader_size,
429 if (!RSAVerify(kernel_sign_key, image->config_signature, 433 FIELD_LEN(bootloader_size));
434 DigestUpdate(&ctx, (uint8_t*) &image->padded_header_size,
435 FIELD_LEN(padded_header_size));
436 preamble_digest = DigestFinal(&ctx);
437 if (!RSAVerify(kernel_sign_key, image->preamble_signature,
430 kernel_signature_size, image->kernel_sign_algorithm, 438 kernel_signature_size, image->kernel_sign_algorithm,
431 config_digest)) { 439 preamble_digest)) {
432 error_code = VERIFY_KERNEL_CONFIG_SIGNATURE_FAILED; 440 error_code = VERIFY_KERNEL_PREAMBLE_SIGNATURE_FAILED;
433 goto verify_failure; 441 goto verify_failure;
434 } 442 }
435 443
436 /* Verify kernel signature - kernel signature is computed on the contents 444 /* Verify kernel signature - kernel signature is computed on the contents
437 of kernel version + kernel options + kernel_data. */ 445 of kernel version + kernel options + kernel_data. */
438 DigestInit(&kernel_ctx, image->kernel_sign_algorithm); 446 DigestInit(&kernel_ctx, image->kernel_sign_algorithm);
439 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_version, 447 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_version,
440 FIELD_LEN(kernel_version)); 448 FIELD_LEN(kernel_version));
441 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_len, 449 DigestUpdate(&kernel_ctx, (uint8_t*) &image->kernel_len,
442 FIELD_LEN(kernel_len)); 450 FIELD_LEN(kernel_len));
443 DigestUpdate(&kernel_ctx, (uint8_t*) image->kernel_config, 451 DigestUpdate(&kernel_ctx, (uint8_t*) &image->bootloader_offset,
444 FIELD_LEN(kernel_config)); 452 FIELD_LEN(bootloader_offset));
445 DigestUpdate(&kernel_ctx, image->kernel_data, image->kernel_len); 453 DigestUpdate(&kernel_ctx, (uint8_t*) &image->bootloader_size,
454 FIELD_LEN(bootloader_size));
455 DigestUpdate(&kernel_ctx, (uint8_t*) &image->padded_header_size,
456 FIELD_LEN(padded_header_size));
457 DigestUpdate(&kernel_ctx, (uint8_t*) image->kernel_data,
458 image->kernel_len);
446 kernel_digest = DigestFinal(&kernel_ctx); 459 kernel_digest = DigestFinal(&kernel_ctx);
447 if (!RSAVerify(kernel_sign_key, image->kernel_signature, 460 if (!RSAVerify(kernel_sign_key, image->kernel_signature,
448 kernel_signature_size, image->kernel_sign_algorithm, 461 kernel_signature_size, image->kernel_sign_algorithm,
449 kernel_digest)) { 462 kernel_digest)) {
450 error_code = VERIFY_KERNEL_SIGNATURE_FAILED; 463 error_code = VERIFY_KERNEL_SIGNATURE_FAILED;
451 goto verify_failure; 464 goto verify_failure;
452 } 465 }
453 466
454 verify_failure: 467 verify_failure:
455 RSAPublicKeyFree(kernel_sign_key); 468 RSAPublicKeyFree(kernel_sign_key);
456 Free(kernel_digest); 469 Free(kernel_digest);
457 Free(config_digest); 470 Free(preamble_digest);
458 Free(header_digest); 471 Free(header_digest);
459 return error_code; 472 return error_code;
460 } 473 }
461 474
462 const char* VerifyKernelErrorString(int error) { 475 const char* VerifyKernelErrorString(int error) {
463 return kVerifyKernelErrors[error]; 476 return kVerifyKernelErrors[error];
464 } 477 }
465 478
466 int AddKernelKeySignature(KernelImage* image, const char* firmware_key_file) { 479 int AddKernelKeySignature(KernelImage* image, const char* firmware_key_file) {
467 uint8_t* header_blob = NULL; 480 uint8_t* header_blob = NULL;
(...skipping 13 matching lines...) Expand all
481 } 494 }
482 image->kernel_key_signature = Malloc(signature_len); 495 image->kernel_key_signature = Malloc(signature_len);
483 Memcpy(image->kernel_key_signature, signature, signature_len); 496 Memcpy(image->kernel_key_signature, signature, signature_len);
484 Free(signature); 497 Free(signature);
485 Free(header_blob); 498 Free(header_blob);
486 return 1; 499 return 1;
487 } 500 }
488 501
489 int AddKernelSignature(KernelImage* image, 502 int AddKernelSignature(KernelImage* image,
490 const char* kernel_signing_key_file) { 503 const char* kernel_signing_key_file) {
491 uint8_t* config_blob = NULL; 504 uint8_t* preamble_blob = NULL;
492 uint8_t* config_signature = NULL; 505 uint8_t* preamble_signature = NULL;
493 uint8_t* kernel_signature = NULL; 506 uint8_t* kernel_signature = NULL;
494 uint8_t* kernel_buf; 507 uint8_t* kernel_buf;
495 int signature_len = siglen_map[image->kernel_sign_algorithm]; 508 int signature_len = siglen_map[image->kernel_sign_algorithm];
496 509
497 config_blob = GetKernelConfigBlob(image); 510 preamble_blob = GetKernelPreambleBlob(image);
498 if (!(config_signature = SignatureBuf(config_blob, 511 if (!(preamble_signature = SignatureBuf(preamble_blob,
499 GetKernelConfigLen(image), 512 GetKernelPreambleLen(),
500 kernel_signing_key_file, 513 kernel_signing_key_file,
501 image->kernel_sign_algorithm))) { 514 image->kernel_sign_algorithm))) {
502 debug("Could not compute signature on the kernel config.\n"); 515 debug("Could not compute signature on the kernel preamble.\n");
503 Free(config_blob); 516 Free(preamble_blob);
504 return 0; 517 return 0;
505 } 518 }
506 519
507 image->config_signature = (uint8_t*) Malloc(signature_len); 520 image->preamble_signature = (uint8_t*) Malloc(signature_len);
508 Memcpy(image->config_signature, config_signature, signature_len); 521 Memcpy(image->preamble_signature, preamble_signature, signature_len);
509 Free(config_signature); 522 Free(preamble_signature);
510 /* Kernel signature muse be calculated on the kernel version, options and 523 /* Kernel signature muse be calculated on the kernel version, options and
511 * kernel data to avoid splicing attacks. */ 524 * kernel data to avoid splicing attacks. */
512 kernel_buf = (uint8_t*) Malloc(GetKernelConfigLen(image) + 525 kernel_buf = (uint8_t*) Malloc(GetKernelPreambleLen() +
513 image->kernel_len); 526 image->kernel_len);
514 Memcpy(kernel_buf, config_blob, GetKernelConfigLen(image)); 527 Memcpy(kernel_buf, preamble_blob, GetKernelPreambleLen());
515 Memcpy(kernel_buf + GetKernelConfigLen(image), image->kernel_data, 528 Memcpy(kernel_buf + GetKernelPreambleLen(), image->kernel_data,
516 image->kernel_len); 529 image->kernel_len);
517 if (!(kernel_signature = SignatureBuf(kernel_buf, 530 if (!(kernel_signature = SignatureBuf(kernel_buf,
518 GetKernelConfigLen(image) + 531 GetKernelPreambleLen() +
519 image->kernel_len, 532 image->kernel_len,
520 kernel_signing_key_file, 533 kernel_signing_key_file,
521 image->kernel_sign_algorithm))) { 534 image->kernel_sign_algorithm))) {
522 Free(config_blob); 535 Free(preamble_blob);
523 Free(kernel_buf); 536 Free(kernel_buf);
524 debug("Could not compute signature on the kernel.\n"); 537 debug("Could not compute signature on the kernel.\n");
525 return 0; 538 return 0;
526 } 539 }
527 image->kernel_signature = (uint8_t*) Malloc(signature_len); 540 image->kernel_signature = (uint8_t*) Malloc(signature_len);
528 Memcpy(image->kernel_signature, kernel_signature, signature_len); 541 Memcpy(image->kernel_signature, kernel_signature, signature_len);
529 Free(kernel_signature); 542 Free(kernel_signature);
530 Free(kernel_buf); 543 Free(kernel_buf);
531 Free(config_blob); 544 Free(preamble_blob);
532 return 1; 545 return 1;
533 } 546 }
534 547
535 void PrintKernelEntry(kernel_entry* entry) { 548 void PrintKernelEntry(kernel_entry* entry) {
536 debug("Boot Priority = %d\n", entry->boot_priority); 549 debug("Boot Priority = %d\n", entry->boot_priority);
537 debug("Boot Tries Remaining = %d\n", entry->boot_tries_remaining); 550 debug("Boot Tries Remaining = %d\n", entry->boot_tries_remaining);
538 debug("Boot Success Flag = %d\n", entry->boot_success_flag); 551 debug("Boot Success Flag = %d\n", entry->boot_success_flag);
539 } 552 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698