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 * Common functions used by tests. | 5 * Common functions used by tests. |
6 */ | 6 */ |
7 | 7 |
8 #include "test_common.h" | 8 #include "test_common.h" |
9 | 9 |
10 #include <stdio.h> | 10 #include <stdio.h> |
11 | 11 |
| 12 #include "file_keys.h" |
| 13 #include "rsa_utility.h" |
| 14 #include "utility.h" |
| 15 |
12 /* ANSI Color coding sequences. */ | 16 /* ANSI Color coding sequences. */ |
13 #define COL_GREEN "\e[1;32m" | 17 #define COL_GREEN "\e[1;32m" |
14 #define COL_RED "\e[0;31m]" | 18 #define COL_RED "\e[0;31m" |
15 #define COL_STOP "\e[m" | 19 #define COL_STOP "\e[m" |
16 | 20 |
17 /* Global test success flag. */ | 21 /* Global test success flag. */ |
18 int gTestSuccess = 1; | 22 int gTestSuccess = 1; |
19 | 23 |
20 int TEST_EQ(int result, int expected_result, char* testname) { | 24 int TEST_EQ(int result, int expected_result, char* testname) { |
21 if (result == expected_result) { | 25 if (result == expected_result) { |
22 fprintf(stderr, "%s Test " COL_GREEN " PASSED\n" COL_STOP, testname); | 26 fprintf(stderr, "%s Test " COL_GREEN " PASSED\n" COL_STOP, testname); |
23 return 1; | 27 return 1; |
24 } | 28 } |
25 else { | 29 else { |
26 fprintf(stderr, "%s Test " COL_RED " FAILED\n" COL_STOP, testname); | 30 fprintf(stderr, "%s Test " COL_RED " FAILED\n" COL_STOP, testname); |
27 gTestSuccess = 0; | 31 gTestSuccess = 0; |
28 return 0; | 32 return 0; |
29 } | 33 } |
30 } | 34 } |
| 35 |
| 36 FirmwareImage* GenerateTestFirmwareImage(int algorithm, |
| 37 const uint8_t* firmware_sign_key, |
| 38 int firmware_key_version, |
| 39 int firmware_version, |
| 40 int firmware_len, |
| 41 const char* root_key_file, |
| 42 const char* firmware_key_file) { |
| 43 FirmwareImage* image = FirmwareImageNew(); |
| 44 |
| 45 Memcpy(image->magic, FIRMWARE_MAGIC, FIRMWARE_MAGIC_SIZE); |
| 46 image->firmware_sign_algorithm = algorithm; |
| 47 image->firmware_sign_key = (uint8_t*) Malloc( |
| 48 RSAProcessedKeySize(image->firmware_sign_algorithm)); |
| 49 Memcpy(image->firmware_sign_key, firmware_sign_key, |
| 50 RSAProcessedKeySize(image->firmware_sign_algorithm)); |
| 51 image->firmware_key_version = firmware_key_version; |
| 52 |
| 53 /* Update correct header length. */ |
| 54 image->header_len = GetFirmwareHeaderLen(image); |
| 55 |
| 56 /* Calculate SHA-512 digest on header and populate header_checksum. */ |
| 57 CalculateFirmwareHeaderChecksum(image, image->header_checksum); |
| 58 |
| 59 /* Populate firmware and preamble with dummy data. */ |
| 60 image->firmware_version = firmware_version; |
| 61 image->firmware_len = firmware_len; |
| 62 image->preamble_signature = image->firmware_signature = NULL; |
| 63 Memset(image->preamble, 'P', FIRMWARE_PREAMBLE_SIZE); |
| 64 image->firmware_data = Malloc(image->firmware_len); |
| 65 Memset(image->firmware_data, 'F', image->firmware_len); |
| 66 |
| 67 /* Generate and populate signatures. */ |
| 68 if (!AddFirmwareKeySignature(image, root_key_file)) { |
| 69 fprintf(stderr, "Couldn't create key signature.\n"); |
| 70 FirmwareImageFree(image); |
| 71 return NULL; |
| 72 } |
| 73 |
| 74 if (!AddFirmwareSignature(image, firmware_key_file)) { |
| 75 fprintf(stderr, "Couldn't create firmware and preamble signature.\n"); |
| 76 FirmwareImageFree(image); |
| 77 return NULL; |
| 78 } |
| 79 return image; |
| 80 } |
| 81 |
| 82 uint8_t* GenerateTestFirmwareBlob(int algorithm, |
| 83 const uint8_t* firmware_sign_key, |
| 84 int firmware_key_version, |
| 85 int firmware_version, |
| 86 int firmware_len, |
| 87 const char* root_key_file, |
| 88 const char* firmware_key_file) { |
| 89 FirmwareImage* image = NULL; |
| 90 uint8_t* firmware_blob = NULL; |
| 91 uint64_t firmware_blob_len = 0; |
| 92 |
| 93 image = GenerateTestFirmwareImage(algorithm, |
| 94 firmware_sign_key, |
| 95 firmware_key_version, |
| 96 firmware_version, |
| 97 firmware_len, |
| 98 root_key_file, |
| 99 firmware_key_file); |
| 100 firmware_blob = GetFirmwareBlob(image, &firmware_blob_len); |
| 101 FirmwareImageFree(image); |
| 102 return firmware_blob; |
| 103 } |
| 104 |
| 105 uint8_t* GenerateRollbackTestImage(int firmware_key_version, |
| 106 int firmware_version, |
| 107 int is_corrupt) { |
| 108 FirmwareImage* image = NULL; |
| 109 uint64_t len; |
| 110 uint8_t* firmware_blob = NULL; |
| 111 uint8_t* firmware_sign_key = NULL; |
| 112 |
| 113 firmware_sign_key = BufferFromFile("testkeys/key_rsa1024.keyb", |
| 114 &len); |
| 115 if (!firmware_sign_key) |
| 116 return NULL; |
| 117 image = GenerateTestFirmwareImage(0, /* RSA1024/SHA1 */ |
| 118 firmware_sign_key, |
| 119 firmware_key_version, |
| 120 firmware_version, |
| 121 1, /* Firmware length. */ |
| 122 "testkeys/key_rsa8192.pem", |
| 123 "testkeys/key_rsa1024.pem"); |
| 124 if (!image) |
| 125 return NULL; |
| 126 if (is_corrupt) { |
| 127 /* Invalidate image. */ |
| 128 Memset(image->firmware_data, 'X', image->firmware_len); |
| 129 } |
| 130 |
| 131 firmware_blob = GetFirmwareBlob(image, &len); |
| 132 FirmwareImageFree(image); |
| 133 return firmware_blob; |
| 134 } |
| 135 |
| 136 |
| 137 KernelImage* GenerateTestKernelImage(int firmware_sign_algorithm, |
| 138 int kernel_sign_algorithm, |
| 139 const uint8_t* kernel_sign_key, |
| 140 int kernel_key_version, |
| 141 int kernel_version, |
| 142 int kernel_len, |
| 143 const char* firmware_key_file, |
| 144 const char* kernel_key_file) { |
| 145 KernelImage* image = KernelImageNew(); |
| 146 |
| 147 Memcpy(image->magic, KERNEL_MAGIC, KERNEL_MAGIC_SIZE); |
| 148 image->header_version = 1; |
| 149 image->firmware_sign_algorithm = firmware_sign_algorithm; |
| 150 image->kernel_sign_algorithm = kernel_sign_algorithm; |
| 151 image->kernel_key_version = kernel_key_version; |
| 152 image->kernel_sign_key = (uint8_t*) Malloc( |
| 153 RSAProcessedKeySize(image->kernel_sign_algorithm)); |
| 154 Memcpy(image->kernel_sign_key, kernel_sign_key, |
| 155 RSAProcessedKeySize(image->kernel_sign_algorithm)); |
| 156 |
| 157 /* Update correct header length. */ |
| 158 image->header_len = GetKernelHeaderLen(image); |
| 159 |
| 160 /* Calculate SHA-512 digest on header and populate header_checksum. */ |
| 161 CalculateKernelHeaderChecksum(image, image->header_checksum); |
| 162 |
| 163 /* Populate kernel options and data with dummy data. */ |
| 164 image->kernel_version = kernel_version; |
| 165 image->options.version[0] = 1; |
| 166 image->options.version[1] = 0; |
| 167 Memset(image->options.cmd_line, 0, sizeof(image->options.cmd_line)); |
| 168 image->options.kernel_len = kernel_len; |
| 169 image->options.kernel_load_addr = 0; |
| 170 image->options.kernel_entry_addr = 0; |
| 171 image->kernel_key_signature = image->kernel_signature = NULL; |
| 172 image->kernel_data = Malloc(kernel_len); |
| 173 Memset(image->kernel_data, 'F', kernel_len); |
| 174 |
| 175 /* Generate and populate signatures. */ |
| 176 if (!AddKernelKeySignature(image, firmware_key_file)) { |
| 177 fprintf(stderr, "Couldn't create key signature.\n"); |
| 178 KernelImageFree(image); |
| 179 return NULL; |
| 180 } |
| 181 |
| 182 if (!AddKernelSignature(image, kernel_key_file)) { |
| 183 fprintf(stderr, "Couldn't create kernel option and kernel signature.\n"); |
| 184 KernelImageFree(image); |
| 185 return NULL; |
| 186 } |
| 187 |
| 188 return image; |
| 189 } |
| 190 |
| 191 uint8_t* GenerateTestKernelBlob(int firmware_sign_algorithm, |
| 192 int kernel_sign_algorithm, |
| 193 const uint8_t* kernel_sign_key, |
| 194 int kernel_key_version, |
| 195 int kernel_version, |
| 196 int kernel_len, |
| 197 const char* firmware_key_file, |
| 198 const char* kernel_key_file) { |
| 199 KernelImage* image = NULL; |
| 200 uint8_t* kernel_blob = NULL; |
| 201 uint64_t kernel_blob_len = 0; |
| 202 |
| 203 image = GenerateTestKernelImage(firmware_sign_algorithm, |
| 204 kernel_sign_algorithm, |
| 205 kernel_sign_key, |
| 206 kernel_key_version, |
| 207 kernel_version, |
| 208 kernel_len, |
| 209 firmware_key_file, |
| 210 kernel_key_file); |
| 211 |
| 212 kernel_blob = GetKernelBlob(image, &kernel_blob_len); |
| 213 KernelImageFree(image); |
| 214 return kernel_blob; |
| 215 } |
OLD | NEW |