host_common.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
  2. * Use of this source code is governed by a BSD-style license that can be
  3. * found in the LICENSE file.
  4. *
  5. * Host functions for verified boot.
  6. */
  7. #include <string.h>
  8. #include "2sysincludes.h"
  9. #include "2common.h"
  10. #include "2rsa.h"
  11. #include "host_common.h"
  12. #include "host_key2.h"
  13. #include "utility.h"
  14. #include "vb2_common.h"
  15. #include "vboot_common.h"
  16. struct vb2_fw_preamble *vb2_create_fw_preamble(
  17. uint32_t firmware_version,
  18. const struct vb2_packed_key *kernel_subkey,
  19. const struct vb2_signature *body_signature,
  20. const struct vb2_private_key *signing_key,
  21. uint32_t flags)
  22. {
  23. uint32_t signed_size = (sizeof(struct vb2_fw_preamble) +
  24. kernel_subkey->key_size +
  25. body_signature->sig_size);
  26. uint32_t block_size = signed_size +
  27. vb2_rsa_sig_size(signing_key->sig_alg);
  28. /* Allocate key block */
  29. struct vb2_fw_preamble *h =
  30. (struct vb2_fw_preamble *)calloc(block_size, 1);
  31. if (!h)
  32. return NULL;
  33. uint8_t *kernel_subkey_dest = (uint8_t *)(h + 1);
  34. uint8_t *body_sig_dest = kernel_subkey_dest + kernel_subkey->key_size;
  35. uint8_t *block_sig_dest = body_sig_dest + body_signature->sig_size;
  36. h->header_version_major = FIRMWARE_PREAMBLE_HEADER_VERSION_MAJOR;
  37. h->header_version_minor = FIRMWARE_PREAMBLE_HEADER_VERSION_MINOR;
  38. h->preamble_size = block_size;
  39. h->firmware_version = firmware_version;
  40. h->flags = flags;
  41. /* Copy data key */
  42. vb2_init_packed_key(&h->kernel_subkey, kernel_subkey_dest,
  43. kernel_subkey->key_size);
  44. if (VB2_SUCCESS !=
  45. vb2_copy_packed_key(&h->kernel_subkey, kernel_subkey)) {
  46. free(h);
  47. return NULL;
  48. }
  49. /* Copy body signature */
  50. vb2_init_signature(&h->body_signature,
  51. body_sig_dest, body_signature->sig_size, 0);
  52. if (VB2_SUCCESS !=
  53. vb2_copy_signature(&h->body_signature, body_signature)) {
  54. free(h);
  55. return NULL;
  56. }
  57. /* Set up signature struct so we can calculate the signature */
  58. vb2_init_signature(&h->preamble_signature, block_sig_dest,
  59. vb2_rsa_sig_size(signing_key->sig_alg), signed_size);
  60. /* Calculate signature */
  61. struct vb2_signature *sig =
  62. vb2_calculate_signature((uint8_t *)h, signed_size, signing_key);
  63. vb2_copy_signature(&h->preamble_signature, sig);
  64. free(sig);
  65. /* Return the header */
  66. return h;
  67. }
  68. struct vb2_kernel_preamble *vb2_create_kernel_preamble(
  69. uint32_t kernel_version,
  70. uint64_t body_load_address,
  71. uint64_t bootloader_address,
  72. uint32_t bootloader_size,
  73. const struct vb2_signature *body_signature,
  74. uint64_t vmlinuz_header_address,
  75. uint32_t vmlinuz_header_size,
  76. uint32_t flags,
  77. uint32_t desired_size,
  78. const struct vb2_private_key *signing_key)
  79. {
  80. uint64_t signed_size = (sizeof(struct vb2_kernel_preamble) +
  81. body_signature->sig_size);
  82. uint32_t sig_size = vb2_rsa_sig_size(signing_key->sig_alg);
  83. uint32_t block_size = signed_size + sig_size;
  84. /* If the block size is smaller than the desired size, pad it */
  85. if (block_size < desired_size)
  86. block_size = desired_size;
  87. /* Allocate key block */
  88. struct vb2_kernel_preamble *h =
  89. (struct vb2_kernel_preamble *)calloc(block_size, 1);
  90. if (!h)
  91. return NULL;
  92. uint8_t *body_sig_dest = (uint8_t *)(h + 1);
  93. uint8_t *block_sig_dest = body_sig_dest + body_signature->sig_size;
  94. h->header_version_major = KERNEL_PREAMBLE_HEADER_VERSION_MAJOR;
  95. h->header_version_minor = KERNEL_PREAMBLE_HEADER_VERSION_MINOR;
  96. h->preamble_size = block_size;
  97. h->kernel_version = kernel_version;
  98. h->body_load_address = body_load_address;
  99. h->bootloader_address = bootloader_address;
  100. h->bootloader_size = bootloader_size;
  101. h->vmlinuz_header_address = vmlinuz_header_address;
  102. h->vmlinuz_header_size = vmlinuz_header_size;
  103. h->flags = flags;
  104. /* Copy body signature */
  105. vb2_init_signature(&h->body_signature, body_sig_dest,
  106. body_signature->sig_size, 0);
  107. vb2_copy_signature(&h->body_signature, body_signature);
  108. /* Set up signature struct so we can calculate the signature */
  109. vb2_init_signature(&h->preamble_signature, block_sig_dest,
  110. sig_size, signed_size);
  111. /* Calculate signature */
  112. struct vb2_signature *sigtmp =
  113. vb2_calculate_signature((uint8_t *)h, signed_size, signing_key);
  114. vb2_copy_signature(&h->preamble_signature, sigtmp);
  115. free(sigtmp);
  116. /* Return the header */
  117. return h;
  118. }