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

Side by Side Diff: src/platform/vboot_reference/utils/firmware_image.c

Issue 1430001: VBoot Reference: Fix splicing bugs in Firmware and Kernel verification. (Closed)
Patch Set: . Created 10 years, 9 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 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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698