| 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 |