vboot_api_kernel5_tests.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  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. * Tests for vboot_api_kernel.c
  6. */
  7. #include <stdint.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include "2sysincludes.h"
  12. #include "2common.h"
  13. #include "2rsa.h"
  14. #include "gbb_header.h"
  15. #include "host_common.h"
  16. #include "load_kernel_fw.h"
  17. #include "test_common.h"
  18. #include "vb2_common.h"
  19. #include "vboot_api.h"
  20. #include "vboot_common.h"
  21. #include "vboot_kernel.h"
  22. #include "vboot_nvstorage.h"
  23. #include "vboot_struct.h"
  24. /* Mock data */
  25. static VbCommonParams cparams;
  26. static VbSelectAndLoadKernelParams kparams;
  27. static uint8_t shared_data[VB_SHARED_DATA_MIN_SIZE];
  28. static VbSharedDataHeader *shared = (VbSharedDataHeader *)shared_data;
  29. static GoogleBinaryBlockHeader gbb;
  30. static uint8_t kernel_buffer[80000];
  31. static int key_block_verify_fail; /* 0=ok, 1=sig, 2=hash */
  32. static int preamble_verify_fail;
  33. static int verify_data_fail;
  34. static int unpack_key_fail;
  35. static VbNvContext vnc;
  36. static VbKeyBlockHeader kbh;
  37. static VbKernelPreambleHeader kph;
  38. static int hash_only_check;
  39. /**
  40. * Reset mock data (for use before each test)
  41. */
  42. static void ResetMocks(void)
  43. {
  44. memset(&cparams, 0, sizeof(cparams));
  45. cparams.shared_data_size = sizeof(shared_data);
  46. cparams.shared_data_blob = shared_data;
  47. cparams.gbb_data = &gbb;
  48. cparams.gbb_size = sizeof(gbb);
  49. memset(&kparams, 0, sizeof(kparams));
  50. memset(&gbb, 0, sizeof(gbb));
  51. gbb.major_version = GBB_MAJOR_VER;
  52. gbb.minor_version = GBB_MINOR_VER;
  53. gbb.flags = 0;
  54. memset(&vnc, 0, sizeof(vnc));
  55. VbNvSetup(&vnc);
  56. VbNvTeardown(&vnc); /* So CRC gets generated */
  57. memset(&shared_data, 0, sizeof(shared_data));
  58. VbSharedDataInit(shared, sizeof(shared_data));
  59. key_block_verify_fail = 0;
  60. preamble_verify_fail = 0;
  61. verify_data_fail = 0;
  62. memset(&kbh, 0, sizeof(kbh));
  63. kbh.data_key.key_version = 2;
  64. kbh.key_block_flags = -1;
  65. kbh.key_block_size = sizeof(kbh);
  66. memset(&kph, 0, sizeof(kph));
  67. kph.kernel_version = 1;
  68. kph.preamble_size = 4096 - kbh.key_block_size;
  69. kph.body_signature.data_size = 70144;
  70. kph.bootloader_address = 0xbeadd008;
  71. kph.bootloader_size = 0x1234;
  72. memcpy(kernel_buffer, &kbh, sizeof(kbh));
  73. memcpy((kernel_buffer + kbh.key_block_size), &kph, sizeof(kph));
  74. hash_only_check = -1;
  75. }
  76. static void copy_kbh(void)
  77. {
  78. memcpy(kernel_buffer, &kbh, sizeof(kbh));
  79. }
  80. /* Mocks */
  81. int vb2_unpack_key_buffer(struct vb2_public_key *key,
  82. const uint8_t *buf,
  83. uint32_t size)
  84. {
  85. if (--unpack_key_fail == 0)
  86. return VB2_ERROR_MOCK;
  87. return VB2_SUCCESS;
  88. }
  89. int vb2_verify_keyblock(struct vb2_keyblock *block,
  90. uint32_t size,
  91. const struct vb2_public_key *key,
  92. const struct vb2_workbuf *wb)
  93. {
  94. hash_only_check = 0;
  95. if (key_block_verify_fail)
  96. return VB2_ERROR_MOCK;
  97. /* Use this as an opportunity to override the key block */
  98. memcpy((void *)block, &kbh, sizeof(kbh));
  99. return VB2_SUCCESS;
  100. }
  101. int vb2_verify_keyblock_hash(const struct vb2_keyblock *block,
  102. uint32_t size,
  103. const struct vb2_workbuf *wb)
  104. {
  105. hash_only_check = 1;
  106. if (key_block_verify_fail)
  107. return VB2_ERROR_MOCK;
  108. /* Use this as an opportunity to override the key block */
  109. memcpy((void *)block, &kbh, sizeof(kbh));
  110. return VB2_SUCCESS;
  111. }
  112. int vb2_verify_kernel_preamble(struct vb2_kernel_preamble *preamble,
  113. uint32_t size,
  114. const struct vb2_public_key *key,
  115. const struct vb2_workbuf *wb)
  116. {
  117. if (preamble_verify_fail)
  118. return VB2_ERROR_MOCK;
  119. /* Use this as an opportunity to override the preamble */
  120. memcpy((void *)preamble, &kph, sizeof(kph));
  121. return VB2_SUCCESS;
  122. }
  123. int vb2_verify_data(const uint8_t *data,
  124. uint32_t size,
  125. struct vb2_signature *sig,
  126. const struct vb2_public_key *key,
  127. const struct vb2_workbuf *wb)
  128. {
  129. if (verify_data_fail)
  130. return VB2_ERROR_MOCK;
  131. return VB2_SUCCESS;
  132. }
  133. VbError_t VbExNvStorageRead(uint8_t *buf)
  134. {
  135. memcpy(buf, vnc.raw, sizeof(vnc.raw));
  136. return VBERROR_SUCCESS;
  137. }
  138. static void VerifyMemoryBootImageTest(void)
  139. {
  140. uint32_t u;
  141. int kernel_body_offset;
  142. int kernel_body_size;
  143. uintptr_t kernel_body_start;
  144. size_t kernel_buffer_size = sizeof(kernel_buffer);
  145. ResetMocks();
  146. kernel_body_offset = kbh.key_block_size + kph.preamble_size;
  147. kernel_body_size = sizeof(kernel_buffer) - kernel_body_offset;
  148. kernel_body_start = (uintptr_t)kernel_buffer + kernel_body_offset;
  149. u = VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  150. kernel_buffer_size);
  151. TEST_EQ(u, 0, "Image good");
  152. TEST_EQ(kparams.partition_number, 0, " part num");
  153. TEST_EQ(kparams.bootloader_address, 0xbeadd008, " bootloader addr");
  154. TEST_EQ(kparams.bootloader_size, 0x1234, " bootloader size");
  155. TEST_PTR_EQ(kparams.kernel_buffer, (void *)(kernel_body_start),
  156. " kernel buffer");
  157. TEST_EQ(kparams.kernel_buffer_size, kernel_body_size,
  158. " kernel buffer size");
  159. /* Empty image buffer. */
  160. ResetMocks();
  161. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, NULL,
  162. kernel_buffer_size),
  163. VBERROR_INVALID_PARAMETER, "Empty image");
  164. /* Illegal image size. */
  165. ResetMocks();
  166. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer, 0),
  167. VBERROR_INVALID_PARAMETER, "Illegal image size");
  168. /* Key Block Verification Failure */
  169. ResetMocks();
  170. key_block_verify_fail = 1;
  171. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  172. kernel_buffer_size),
  173. VBERROR_INVALID_KERNEL_FOUND, "Key verify failed");
  174. TEST_EQ(hash_only_check, 0, " hash check");
  175. /* Key Block Hash Failure */
  176. ResetMocks();
  177. shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
  178. gbb.flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
  179. key_block_verify_fail = 1;
  180. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  181. kernel_buffer_size),
  182. VBERROR_INVALID_KERNEL_FOUND, "Key verify failed");
  183. TEST_EQ(hash_only_check, 1, " hash check");
  184. /* Key Block Hash Failure -- VBNV */
  185. ResetMocks();
  186. shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
  187. key_block_verify_fail = 1;
  188. VbNvSet(&vnc, VBNV_DEV_BOOT_FASTBOOT_FULL_CAP, 1);
  189. VbNvTeardown(&vnc);
  190. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  191. kernel_buffer_size),
  192. VBERROR_INVALID_KERNEL_FOUND, "Key verify failed");
  193. TEST_EQ(hash_only_check, 1, " hash check -- VBNV flag");
  194. /* Developer flag mismatch - dev switch on */
  195. ResetMocks();
  196. kbh.key_block_flags = KEY_BLOCK_FLAG_DEVELOPER_0 |
  197. KEY_BLOCK_FLAG_RECOVERY_1;
  198. copy_kbh();
  199. shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
  200. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  201. kernel_buffer_size),
  202. VBERROR_INVALID_KERNEL_FOUND,
  203. "Developer flag mismatch - dev switch on");
  204. /* Developer flag mismatch - dev switch on with GBB override */
  205. ResetMocks();
  206. kbh.key_block_flags = KEY_BLOCK_FLAG_DEVELOPER_0 |
  207. KEY_BLOCK_FLAG_RECOVERY_1;
  208. copy_kbh();
  209. gbb.flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
  210. shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
  211. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  212. kernel_buffer_size),
  213. VBERROR_SUCCESS,
  214. "Developer flag mismatch - dev switch on(gbb override)");
  215. /* Recovery flag mismatch - dev switch on with GBB override */
  216. ResetMocks();
  217. kbh.key_block_flags = KEY_BLOCK_FLAG_DEVELOPER_0 |
  218. KEY_BLOCK_FLAG_RECOVERY_0;
  219. copy_kbh();
  220. shared->flags = VBSD_BOOT_DEV_SWITCH_ON;
  221. gbb.flags = GBB_FLAG_FORCE_DEV_BOOT_FASTBOOT_FULL_CAP;
  222. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  223. kernel_buffer_size),
  224. VBERROR_SUCCESS,
  225. "Recovery flag mismatch - dev switch on(gbb override)");
  226. /* Developer flag mismatch - dev switch off */
  227. ResetMocks();
  228. kbh.key_block_flags = KEY_BLOCK_FLAG_DEVELOPER_1 |
  229. KEY_BLOCK_FLAG_RECOVERY_1;
  230. copy_kbh();
  231. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  232. kernel_buffer_size),
  233. VBERROR_INVALID_KERNEL_FOUND,
  234. "Developer flag mismatch - dev switch off");
  235. /* Recovery flag mismatch */
  236. ResetMocks();
  237. kbh.key_block_flags = KEY_BLOCK_FLAG_DEVELOPER_0 |
  238. KEY_BLOCK_FLAG_RECOVERY_0;
  239. shared->flags = 0;
  240. copy_kbh();
  241. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  242. kernel_buffer_size),
  243. VBERROR_INVALID_KERNEL_FOUND, "Recovery flag mismatch");
  244. /* Preamble verification */
  245. ResetMocks();
  246. preamble_verify_fail = 1;
  247. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  248. kernel_buffer_size),
  249. VBERROR_INVALID_KERNEL_FOUND, "Preamble verification");
  250. /* Data verification */
  251. ResetMocks();
  252. verify_data_fail = 1;
  253. TEST_EQ(VbVerifyMemoryBootImage(&cparams, &kparams, kernel_buffer,
  254. kernel_buffer_size),
  255. VBERROR_INVALID_KERNEL_FOUND, "Data verification");
  256. }
  257. int main(void)
  258. {
  259. VerifyMemoryBootImageTest();
  260. return gTestSuccess ? 0 : 255;
  261. }