OLD | NEW |
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 firmware image. | 5 * Functions for generating and manipulating a verified boot firmware image. |
6 */ | 6 */ |
7 | 7 |
8 #include "firmware_image.h" | 8 #include "firmware_image.h" |
9 | 9 |
10 #include <fcntl.h> | 10 #include <fcntl.h> |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 RSAProcessedKeySize(image->firmware_sign_algorithm)); | 183 RSAProcessedKeySize(image->firmware_sign_algorithm)); |
184 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum)); | 184 StatefulMemcpy_r(&st, &image->header_checksum, FIELD_LEN(header_checksum)); |
185 | 185 |
186 if (st.remaining_len != 0) { /* Underrun or Overrun. */ | 186 if (st.remaining_len != 0) { /* Underrun or Overrun. */ |
187 Free(header_blob); | 187 Free(header_blob); |
188 return NULL; | 188 return NULL; |
189 } | 189 } |
190 return header_blob; | 190 return header_blob; |
191 } | 191 } |
192 | 192 |
193 int GetFirmwarePreambleLen(const FirmwareImage* image) { | 193 int GetFirmwarePreambleLen(void) { |
194 return (FIELD_LEN(firmware_version) + FIELD_LEN(firmware_len) + | 194 return (FIELD_LEN(firmware_version) + FIELD_LEN(firmware_len) + |
195 FIELD_LEN(preamble)); | 195 FIELD_LEN(preamble)); |
196 } | 196 } |
197 | 197 |
198 uint8_t* GetFirmwarePreambleBlob(const FirmwareImage* image) { | 198 uint8_t* GetFirmwarePreambleBlob(const FirmwareImage* image) { |
199 uint8_t* preamble_blob = NULL; | 199 uint8_t* preamble_blob = NULL; |
200 MemcpyState st; | 200 MemcpyState st; |
201 | 201 |
202 preamble_blob = (uint8_t*) Malloc(GetFirmwarePreambleLen(image)); | 202 preamble_blob = (uint8_t*) Malloc(GetFirmwarePreambleLen()); |
203 st.remaining_len = GetFirmwarePreambleLen(image); | 203 st.remaining_len = GetFirmwarePreambleLen(); |
204 st.remaining_buf = preamble_blob; | 204 st.remaining_buf = preamble_blob; |
205 | 205 |
206 StatefulMemcpy_r(&st, &image->firmware_version, FIELD_LEN(firmware_version)); | 206 StatefulMemcpy_r(&st, &image->firmware_version, FIELD_LEN(firmware_version)); |
207 StatefulMemcpy_r(&st, &image->firmware_len, FIELD_LEN(firmware_len)); | 207 StatefulMemcpy_r(&st, &image->firmware_len, FIELD_LEN(firmware_len)); |
208 StatefulMemcpy_r(&st, image->preamble, FIELD_LEN(preamble)); | 208 StatefulMemcpy_r(&st, image->preamble, FIELD_LEN(preamble)); |
209 | 209 |
210 if (st.remaining_len != 0 ) { /* Underrun or Overrun. */ | 210 if (st.remaining_len != 0 ) { /* Underrun or Overrun. */ |
211 Free(preamble_blob); | 211 Free(preamble_blob); |
212 return NULL; | 212 return NULL; |
213 } | 213 } |
214 return preamble_blob; | 214 return preamble_blob; |
215 } | 215 } |
216 | 216 |
217 | 217 |
218 uint8_t* GetFirmwareBlob(const FirmwareImage* image, uint64_t* blob_len) { | 218 uint8_t* GetFirmwareBlob(const FirmwareImage* image, uint64_t* blob_len) { |
219 int firmware_signature_len; | 219 int firmware_signature_len; |
220 uint8_t* firmware_blob = NULL; | 220 uint8_t* firmware_blob = NULL; |
221 uint8_t* header_blob = NULL; | 221 uint8_t* header_blob = NULL; |
222 uint8_t* preamble_blob = NULL; | 222 uint8_t* preamble_blob = NULL; |
223 MemcpyState st; | 223 MemcpyState st; |
224 | 224 |
225 if (!image) | 225 if (!image) |
226 return NULL; | 226 return NULL; |
227 | 227 |
228 firmware_signature_len = siglen_map[image->firmware_sign_algorithm]; | 228 firmware_signature_len = siglen_map[image->firmware_sign_algorithm]; |
229 *blob_len = (FIELD_LEN(magic) + | 229 *blob_len = (FIELD_LEN(magic) + |
230 GetFirmwareHeaderLen(image) + | 230 GetFirmwareHeaderLen(image) + |
231 FIELD_LEN(firmware_key_signature) + | 231 FIELD_LEN(firmware_key_signature) + |
232 GetFirmwarePreambleLen(image) + | 232 GetFirmwarePreambleLen() + |
233 2 * firmware_signature_len + | 233 2 * firmware_signature_len + |
234 image->firmware_len); | 234 image->firmware_len); |
235 firmware_blob = (uint8_t*) Malloc(*blob_len); | 235 firmware_blob = (uint8_t*) Malloc(*blob_len); |
236 st.remaining_len = *blob_len; | 236 st.remaining_len = *blob_len; |
237 st.remaining_buf = firmware_blob; | 237 st.remaining_buf = firmware_blob; |
238 | 238 |
239 header_blob = GetFirmwareHeaderBlob(image); | 239 header_blob = GetFirmwareHeaderBlob(image); |
240 preamble_blob = GetFirmwarePreambleBlob(image); | 240 preamble_blob = GetFirmwarePreambleBlob(image); |
241 | 241 |
242 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic)); | 242 StatefulMemcpy_r(&st, image->magic, FIELD_LEN(magic)); |
243 StatefulMemcpy_r(&st, header_blob, GetFirmwareHeaderLen(image)); | 243 StatefulMemcpy_r(&st, header_blob, GetFirmwareHeaderLen(image)); |
244 StatefulMemcpy_r(&st, image->firmware_key_signature, | 244 StatefulMemcpy_r(&st, image->firmware_key_signature, |
245 FIELD_LEN(firmware_key_signature)); | 245 FIELD_LEN(firmware_key_signature)); |
246 StatefulMemcpy_r(&st, preamble_blob, GetFirmwarePreambleLen(image)); | 246 StatefulMemcpy_r(&st, preamble_blob, GetFirmwarePreambleLen()); |
247 StatefulMemcpy_r(&st, image->preamble_signature, firmware_signature_len); | 247 StatefulMemcpy_r(&st, image->preamble_signature, firmware_signature_len); |
248 StatefulMemcpy_r(&st, image->firmware_signature, firmware_signature_len); | 248 StatefulMemcpy_r(&st, image->firmware_signature, firmware_signature_len); |
249 StatefulMemcpy_r(&st, image->firmware_data, image->firmware_len); | 249 StatefulMemcpy_r(&st, image->firmware_data, image->firmware_len); |
250 | 250 |
251 Free(preamble_blob); | 251 Free(preamble_blob); |
252 Free(header_blob); | 252 Free(header_blob); |
253 | 253 |
254 if (st.remaining_len != 0) { /* Underrun or Overrun. */ | 254 if (st.remaining_len != 0) { /* Underrun or Overrun. */ |
255 Free(firmware_blob); | 255 Free(firmware_blob); |
256 return NULL; | 256 return NULL; |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
398 algorithm)) | 398 algorithm)) |
399 return VERIFY_FIRMWARE_PREAMBLE_SIGNATURE_FAILED; | 399 return VERIFY_FIRMWARE_PREAMBLE_SIGNATURE_FAILED; |
400 | 400 |
401 Memcpy(&len, preamble_blob + FIELD_LEN(firmware_version), | 401 Memcpy(&len, preamble_blob + FIELD_LEN(firmware_version), |
402 sizeof(len)); | 402 sizeof(len)); |
403 *firmware_len = (int) len; | 403 *firmware_len = (int) len; |
404 return 0; | 404 return 0; |
405 } | 405 } |
406 | 406 |
407 int VerifyFirmwareData(RSAPublicKey* firmware_sign_key, | 407 int VerifyFirmwareData(RSAPublicKey* firmware_sign_key, |
| 408 const uint8_t* preamble_start, |
408 const uint8_t* firmware_data_start, | 409 const uint8_t* firmware_data_start, |
409 int firmware_len, | 410 int firmware_len, |
410 int algorithm) { | 411 int algorithm) { |
411 int signature_len = siglen_map[algorithm]; | 412 int signature_len = siglen_map[algorithm]; |
412 if (!RSAVerifyBinary_f(NULL, firmware_sign_key, /* Key to use. */ | 413 uint8_t* digest; |
413 firmware_data_start + signature_len, /* Data to | 414 DigestContext ctx; |
414 * verify */ | 415 |
415 firmware_len, /* Length of data. */ | 416 /* Since the firmware signature is over the preamble and the firmware data, |
416 firmware_data_start, /* Expected Signature */ | 417 * which does not form a contiguous region of memory, we calculate the |
417 algorithm)) | 418 * message digest ourselves. */ |
| 419 DigestInit(&ctx, algorithm); |
| 420 DigestUpdate(&ctx, preamble_start, GetFirmwarePreambleLen()); |
| 421 DigestUpdate(&ctx, firmware_data_start + signature_len, firmware_len); |
| 422 digest = DigestFinal(&ctx); |
| 423 if (!RSAVerifyBinaryWithDigest_f( |
| 424 NULL, firmware_sign_key, /* Key to use. */ |
| 425 digest, /* Digest of the data to verify. */ |
| 426 firmware_data_start, /* Expected Signature */ |
| 427 algorithm)) { |
| 428 Free(digest); |
418 return VERIFY_FIRMWARE_SIGNATURE_FAILED; | 429 return VERIFY_FIRMWARE_SIGNATURE_FAILED; |
| 430 } |
| 431 Free(digest); |
419 return 0; | 432 return 0; |
420 } | 433 } |
421 | 434 |
422 int VerifyFirmware(const uint8_t* root_key_blob, | 435 int VerifyFirmware(const uint8_t* root_key_blob, |
423 const uint8_t* firmware_blob) { | 436 const uint8_t* firmware_blob) { |
424 int error_code; | 437 int error_code = 0; |
425 int algorithm; /* Signing key algorithm. */ | 438 int algorithm; /* Signing key algorithm. */ |
426 RSAPublicKey* firmware_sign_key = NULL; | 439 RSAPublicKey* firmware_sign_key = NULL; |
427 int firmware_sign_key_len, signature_len, header_len, firmware_len; | 440 int firmware_sign_key_len, signature_len, header_len, firmware_len; |
428 const uint8_t* header_ptr = NULL; /* Pointer to header. */ | 441 const uint8_t* header_ptr = NULL; /* Pointer to header. */ |
429 const uint8_t* firmware_sign_key_ptr = NULL; /* Pointer to signing key. */ | 442 const uint8_t* firmware_sign_key_ptr = NULL; /* Pointer to signing key. */ |
430 const uint8_t* preamble_ptr = NULL; /* Pointer to preamble block. */ | 443 const uint8_t* preamble_ptr = NULL; /* Pointer to preamble block. */ |
431 const uint8_t* firmware_ptr = NULL; /* Pointer to firmware signature/data. */ | 444 const uint8_t* firmware_ptr = NULL; /* Pointer to firmware signature/data. */ |
432 | 445 |
433 /* Note: All the offset calculations are based on struct FirmwareImage which | 446 /* Note: All the offset calculations are based on struct FirmwareImage which |
434 * is defined in include/firmware_image.h. */ | 447 * is defined in include/firmware_image.h. */ |
(...skipping 22 matching lines...) Expand all Loading... |
457 preamble_ptr = (header_ptr + header_len + | 470 preamble_ptr = (header_ptr + header_len + |
458 FIELD_LEN(firmware_key_signature)); | 471 FIELD_LEN(firmware_key_signature)); |
459 if ((error_code = VerifyFirmwarePreamble(firmware_sign_key, preamble_ptr, | 472 if ((error_code = VerifyFirmwarePreamble(firmware_sign_key, preamble_ptr, |
460 algorithm, | 473 algorithm, |
461 &firmware_len))) { | 474 &firmware_len))) { |
462 RSAPublicKeyFree(firmware_sign_key); | 475 RSAPublicKeyFree(firmware_sign_key); |
463 return error_code; /* AKA jump to recovery. */ | 476 return error_code; /* AKA jump to recovery. */ |
464 } | 477 } |
465 /* Only continue if firmware data verification succeeds. */ | 478 /* Only continue if firmware data verification succeeds. */ |
466 firmware_ptr = (preamble_ptr + | 479 firmware_ptr = (preamble_ptr + |
467 GetFirmwarePreambleLen(NULL) + | 480 GetFirmwarePreambleLen() + |
468 signature_len); | 481 signature_len); |
469 | 482 |
470 if ((error_code = VerifyFirmwareData(firmware_sign_key, firmware_ptr, | 483 if ((error_code = VerifyFirmwareData(firmware_sign_key, preamble_ptr, |
| 484 firmware_ptr, |
471 firmware_len, | 485 firmware_len, |
472 algorithm))) { | 486 algorithm))) { |
473 RSAPublicKeyFree(firmware_sign_key); | 487 RSAPublicKeyFree(firmware_sign_key); |
474 return error_code; /* AKA jump to recovery. */ | 488 return error_code; /* AKA jump to recovery. */ |
475 } | 489 } |
476 | 490 |
477 RSAPublicKeyFree(firmware_sign_key); | 491 RSAPublicKeyFree(firmware_sign_key); |
478 return 0; /* Success! */ | 492 return 0; /* Success! */ |
479 } | 493 } |
480 | 494 |
481 int VerifyFirmwareImage(const RSAPublicKey* root_key, | 495 int VerifyFirmwareImage(const RSAPublicKey* root_key, |
482 const FirmwareImage* image) { | 496 const FirmwareImage* image) { |
483 RSAPublicKey* firmware_sign_key = NULL; | 497 RSAPublicKey* firmware_sign_key = NULL; |
484 uint8_t* header_digest = NULL; | 498 uint8_t* header_digest = NULL; |
485 uint8_t* preamble_digest = NULL; | 499 uint8_t* preamble_digest = NULL; |
486 uint8_t* firmware_digest = NULL; | 500 uint8_t* firmware_digest = NULL; |
487 int firmware_sign_key_size; | 501 int firmware_sign_key_size; |
488 int signature_size; | 502 int signature_size; |
489 int error_code = 0; | 503 int error_code = 0; |
490 DigestContext ctx; | 504 DigestContext ctx; |
| 505 DigestContext firmware_ctx; |
491 | 506 |
492 if (!image) | 507 if (!image) |
493 return VERIFY_FIRMWARE_INVALID_IMAGE; | 508 return VERIFY_FIRMWARE_INVALID_IMAGE; |
494 | 509 |
495 /* Verify root key signature on the sign key header if we | 510 /* Verify root key signature on the sign key header if we |
496 * are not in dev mode. | 511 * are not in dev mode. |
497 * | 512 * |
498 * TODO(gauravsh): Add additional sanity checks here for: | 513 * TODO(gauravsh): Add additional sanity checks here for: |
499 * 1) verifying the header length is correct. | 514 * 1) verifying the header length is correct. |
500 * 2) header_checksum is correct. | 515 * 2) header_checksum is correct. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 DigestUpdate(&ctx, (uint8_t*) &image->preamble, | 554 DigestUpdate(&ctx, (uint8_t*) &image->preamble, |
540 FIELD_LEN(preamble)); | 555 FIELD_LEN(preamble)); |
541 preamble_digest = DigestFinal(&ctx); | 556 preamble_digest = DigestFinal(&ctx); |
542 if (!RSAVerify(firmware_sign_key, image->preamble_signature, | 557 if (!RSAVerify(firmware_sign_key, image->preamble_signature, |
543 signature_size, image->firmware_sign_algorithm, | 558 signature_size, image->firmware_sign_algorithm, |
544 preamble_digest)) { | 559 preamble_digest)) { |
545 error_code = VERIFY_FIRMWARE_PREAMBLE_SIGNATURE_FAILED; | 560 error_code = VERIFY_FIRMWARE_PREAMBLE_SIGNATURE_FAILED; |
546 goto verify_failure; | 561 goto verify_failure; |
547 } | 562 } |
548 | 563 |
549 /* Verify firmware signature. */ | 564 /* Verify firmware signature - firmware signature is on the contents |
550 firmware_digest = DigestBuf(image->firmware_data, | 565 of firmware preamble + firmware_data. */ |
551 image->firmware_len, | 566 DigestInit(&firmware_ctx, image->firmware_sign_algorithm); |
552 image->firmware_sign_algorithm); | 567 DigestUpdate(&firmware_ctx, (uint8_t*) &image->firmware_version, |
| 568 FIELD_LEN(firmware_version)); |
| 569 DigestUpdate(&firmware_ctx, (uint8_t*) &image->firmware_len, |
| 570 FIELD_LEN(firmware_len)); |
| 571 DigestUpdate(&firmware_ctx, (uint8_t*) &image->preamble, |
| 572 FIELD_LEN(preamble)); |
| 573 DigestUpdate(&firmware_ctx, image->firmware_data, image->firmware_len); |
| 574 firmware_digest = DigestFinal(&firmware_ctx); |
553 if (!RSAVerify(firmware_sign_key, image->firmware_signature, | 575 if (!RSAVerify(firmware_sign_key, image->firmware_signature, |
554 signature_size, image->firmware_sign_algorithm, | 576 signature_size, image->firmware_sign_algorithm, |
555 firmware_digest)) { | 577 firmware_digest)) { |
556 error_code = VERIFY_FIRMWARE_SIGNATURE_FAILED; | 578 error_code = VERIFY_FIRMWARE_SIGNATURE_FAILED; |
557 goto verify_failure; | 579 goto verify_failure; |
558 } | 580 } |
559 | 581 |
560 verify_failure: | 582 verify_failure: |
561 RSAPublicKeyFree(firmware_sign_key); | 583 RSAPublicKeyFree(firmware_sign_key); |
562 Free(firmware_digest); | 584 Free(firmware_digest); |
(...skipping 21 matching lines...) Expand all Loading... |
584 Free(header_blob); | 606 Free(header_blob); |
585 return 0; | 607 return 0; |
586 } | 608 } |
587 Memcpy(image->firmware_key_signature, signature, RSA8192NUMBYTES); | 609 Memcpy(image->firmware_key_signature, signature, RSA8192NUMBYTES); |
588 Free(header_blob); | 610 Free(header_blob); |
589 Free(signature); | 611 Free(signature); |
590 return 1; | 612 return 1; |
591 } | 613 } |
592 | 614 |
593 int AddFirmwareSignature(FirmwareImage* image, const char* signing_key_file) { | 615 int AddFirmwareSignature(FirmwareImage* image, const char* signing_key_file) { |
594 uint8_t* preamble_blob; | 616 uint8_t* preamble_blob = NULL; |
595 uint8_t* preamble_signature; | 617 uint8_t* preamble_signature = NULL; |
596 uint8_t* firmware_signature; | 618 uint8_t* firmware_signature = NULL; |
| 619 uint8_t* firmware_buf = NULL; |
597 int signature_len = siglen_map[image->firmware_sign_algorithm]; | 620 int signature_len = siglen_map[image->firmware_sign_algorithm]; |
598 | 621 |
599 preamble_blob = GetFirmwarePreambleBlob(image); | 622 preamble_blob = GetFirmwarePreambleBlob(image); |
| 623 if (!preamble_blob) |
| 624 return 0; |
600 if (!(preamble_signature = SignatureBuf(preamble_blob, | 625 if (!(preamble_signature = SignatureBuf(preamble_blob, |
601 GetFirmwarePreambleLen(image), | 626 GetFirmwarePreambleLen(), |
602 signing_key_file, | 627 signing_key_file, |
603 image->firmware_sign_algorithm))) { | 628 image->firmware_sign_algorithm))) { |
604 Free(preamble_blob); | 629 Free(preamble_blob); |
605 return 0; | 630 return 0; |
606 } | 631 } |
607 image->preamble_signature = (uint8_t*) Malloc(signature_len); | 632 image->preamble_signature = (uint8_t*) Malloc(signature_len); |
608 Memcpy(image->preamble_signature, preamble_signature, signature_len); | 633 Memcpy(image->preamble_signature, preamble_signature, signature_len); |
609 Free(preamble_signature); | 634 Free(preamble_signature); |
610 | 635 /* Firmware signature must be calculated on preamble + firmware_data |
611 if (!(firmware_signature = SignatureBuf(image->firmware_data, | 636 * to avoid splicing attacks. */ |
| 637 firmware_buf = (uint8_t*) Malloc(GetFirmwarePreambleLen() + |
| 638 image->firmware_len); |
| 639 Memcpy(firmware_buf, preamble_blob, GetFirmwarePreambleLen()); |
| 640 Memcpy(firmware_buf + GetFirmwarePreambleLen(), image->firmware_data, |
| 641 image->firmware_len); |
| 642 if (!(firmware_signature = SignatureBuf(firmware_buf, |
| 643 GetFirmwarePreambleLen() + |
612 image->firmware_len, | 644 image->firmware_len, |
613 signing_key_file, | 645 signing_key_file, |
614 image->firmware_sign_algorithm))) | 646 image->firmware_sign_algorithm))) { |
| 647 Free(preamble_blob); |
| 648 Free(firmware_buf); |
615 return 0; | 649 return 0; |
| 650 } |
616 image->firmware_signature = (uint8_t*) Malloc(signature_len); | 651 image->firmware_signature = (uint8_t*) Malloc(signature_len); |
617 Memcpy(image->firmware_signature, firmware_signature, signature_len); | 652 Memcpy(image->firmware_signature, firmware_signature, signature_len); |
618 Free(firmware_signature); | 653 Free(firmware_signature); |
| 654 Free(firmware_buf); |
| 655 Free(preamble_blob); |
619 return 1; | 656 return 1; |
620 } | 657 } |
621 | 658 |
622 uint32_t GetLogicalFirmwareVersion(uint8_t* firmware_blob) { | 659 uint32_t GetLogicalFirmwareVersion(uint8_t* firmware_blob) { |
623 uint16_t firmware_key_version; | 660 uint16_t firmware_key_version; |
624 uint16_t firmware_version; | 661 uint16_t firmware_version; |
625 uint16_t firmware_sign_algorithm; | 662 uint16_t firmware_sign_algorithm; |
626 int firmware_sign_key_len; | 663 int firmware_sign_key_len; |
627 Memcpy(&firmware_sign_algorithm, | 664 Memcpy(&firmware_sign_algorithm, |
628 firmware_blob + (FIELD_LEN(magic) + /* Offset to field. */ | 665 firmware_blob + (FIELD_LEN(magic) + /* Offset to field. */ |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 * attempted. | 759 * attempted. |
723 * If FirmwareB is not a rollback, then we attempt to do the verification. | 760 * If FirmwareB is not a rollback, then we attempt to do the verification. |
724 */ | 761 */ |
725 if (stored_lversion <= firmwareB_lversion && | 762 if (stored_lversion <= firmwareB_lversion && |
726 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB))) | 763 (VERIFY_FIRMWARE_SUCCESS == VerifyFirmware(root_key_blob, firmwareB))) |
727 return BOOT_FIRMWARE_B_CONTINUE; | 764 return BOOT_FIRMWARE_B_CONTINUE; |
728 } | 765 } |
729 /* D'oh: No bootable firmware. */ | 766 /* D'oh: No bootable firmware. */ |
730 return BOOT_FIRMWARE_RECOVERY_CONTINUE; | 767 return BOOT_FIRMWARE_RECOVERY_CONTINUE; |
731 } | 768 } |
OLD | NEW |