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> |
(...skipping 21 matching lines...) Expand all Loading... |
32 return 0; | 32 return 0; |
33 } | 33 } |
34 } | 34 } |
35 | 35 |
36 FirmwareImage* GenerateTestFirmwareImage(int algorithm, | 36 FirmwareImage* GenerateTestFirmwareImage(int algorithm, |
37 const uint8_t* firmware_sign_key, | 37 const uint8_t* firmware_sign_key, |
38 int firmware_key_version, | 38 int firmware_key_version, |
39 int firmware_version, | 39 int firmware_version, |
40 int firmware_len, | 40 int firmware_len, |
41 const char* root_key_file, | 41 const char* root_key_file, |
42 const char* firmware_key_file) { | 42 const char* firmware_key_file, |
| 43 uint8_t firmware_data_fill_char) { |
43 FirmwareImage* image = FirmwareImageNew(); | 44 FirmwareImage* image = FirmwareImageNew(); |
44 | 45 |
45 Memcpy(image->magic, FIRMWARE_MAGIC, FIRMWARE_MAGIC_SIZE); | 46 Memcpy(image->magic, FIRMWARE_MAGIC, FIRMWARE_MAGIC_SIZE); |
46 image->firmware_sign_algorithm = algorithm; | 47 image->firmware_sign_algorithm = algorithm; |
47 image->firmware_sign_key = (uint8_t*) Malloc( | 48 image->firmware_sign_key = (uint8_t*) Malloc( |
48 RSAProcessedKeySize(image->firmware_sign_algorithm)); | 49 RSAProcessedKeySize(image->firmware_sign_algorithm)); |
49 Memcpy(image->firmware_sign_key, firmware_sign_key, | 50 Memcpy(image->firmware_sign_key, firmware_sign_key, |
50 RSAProcessedKeySize(image->firmware_sign_algorithm)); | 51 RSAProcessedKeySize(image->firmware_sign_algorithm)); |
51 image->firmware_key_version = firmware_key_version; | 52 image->firmware_key_version = firmware_key_version; |
52 | 53 |
53 /* Update correct header length. */ | 54 /* Update correct header length. */ |
54 image->header_len = GetFirmwareHeaderLen(image); | 55 image->header_len = GetFirmwareHeaderLen(image); |
55 | 56 |
56 /* Calculate SHA-512 digest on header and populate header_checksum. */ | 57 /* Calculate SHA-512 digest on header and populate header_checksum. */ |
57 CalculateFirmwareHeaderChecksum(image, image->header_checksum); | 58 CalculateFirmwareHeaderChecksum(image, image->header_checksum); |
58 | 59 |
59 /* Populate firmware and preamble with dummy data. */ | 60 /* Populate firmware and preamble with dummy data. */ |
60 image->firmware_version = firmware_version; | 61 image->firmware_version = firmware_version; |
61 image->firmware_len = firmware_len; | 62 image->firmware_len = firmware_len; |
62 image->preamble_signature = image->firmware_signature = NULL; | 63 image->preamble_signature = image->firmware_signature = NULL; |
63 Memset(image->preamble, 'P', FIRMWARE_PREAMBLE_SIZE); | 64 Memset(image->preamble, 'P', FIRMWARE_PREAMBLE_SIZE); |
64 image->firmware_data = Malloc(image->firmware_len); | 65 image->firmware_data = Malloc(image->firmware_len); |
65 Memset(image->firmware_data, 'F', image->firmware_len); | 66 Memset(image->firmware_data, firmware_data_fill_char, image->firmware_len); |
66 | 67 |
67 /* Generate and populate signatures. */ | 68 /* Generate and populate signatures. */ |
68 if (!AddFirmwareKeySignature(image, root_key_file)) { | 69 if (!AddFirmwareKeySignature(image, root_key_file)) { |
69 fprintf(stderr, "Couldn't create key signature.\n"); | 70 fprintf(stderr, "Couldn't create key signature.\n"); |
70 FirmwareImageFree(image); | 71 FirmwareImageFree(image); |
71 return NULL; | 72 return NULL; |
72 } | 73 } |
73 | 74 |
74 if (!AddFirmwareSignature(image, firmware_key_file)) { | 75 if (!AddFirmwareSignature(image, firmware_key_file)) { |
75 fprintf(stderr, "Couldn't create firmware and preamble signature.\n"); | 76 fprintf(stderr, "Couldn't create firmware and preamble signature.\n"); |
(...skipping 13 matching lines...) Expand all Loading... |
89 FirmwareImage* image = NULL; | 90 FirmwareImage* image = NULL; |
90 uint8_t* firmware_blob = NULL; | 91 uint8_t* firmware_blob = NULL; |
91 uint64_t firmware_blob_len = 0; | 92 uint64_t firmware_blob_len = 0; |
92 | 93 |
93 image = GenerateTestFirmwareImage(algorithm, | 94 image = GenerateTestFirmwareImage(algorithm, |
94 firmware_sign_key, | 95 firmware_sign_key, |
95 firmware_key_version, | 96 firmware_key_version, |
96 firmware_version, | 97 firmware_version, |
97 firmware_len, | 98 firmware_len, |
98 root_key_file, | 99 root_key_file, |
99 firmware_key_file); | 100 firmware_key_file, |
| 101 'F'); |
100 firmware_blob = GetFirmwareBlob(image, &firmware_blob_len); | 102 firmware_blob = GetFirmwareBlob(image, &firmware_blob_len); |
101 FirmwareImageFree(image); | 103 FirmwareImageFree(image); |
102 return firmware_blob; | 104 return firmware_blob; |
103 } | 105 } |
104 | 106 |
105 uint8_t* GenerateRollbackTestFirmwareBlob(int firmware_key_version, | 107 uint8_t* GenerateRollbackTestFirmwareBlob(int firmware_key_version, |
106 int firmware_version, | 108 int firmware_version, |
107 int is_corrupt) { | 109 int is_corrupt) { |
108 FirmwareImage* image = NULL; | 110 FirmwareImage* image = NULL; |
109 uint64_t len; | 111 uint64_t len; |
110 uint8_t* firmware_blob = NULL; | 112 uint8_t* firmware_blob = NULL; |
111 uint8_t* firmware_sign_key = NULL; | 113 uint8_t* firmware_sign_key = NULL; |
112 | 114 |
113 firmware_sign_key = BufferFromFile("testkeys/key_rsa1024.keyb", | 115 firmware_sign_key = BufferFromFile("testkeys/key_rsa1024.keyb", |
114 &len); | 116 &len); |
115 if (!firmware_sign_key) | 117 if (!firmware_sign_key) |
116 return NULL; | 118 return NULL; |
117 image = GenerateTestFirmwareImage(0, /* RSA1024/SHA1 */ | 119 image = GenerateTestFirmwareImage(0, /* RSA1024/SHA1 */ |
118 firmware_sign_key, | 120 firmware_sign_key, |
119 firmware_key_version, | 121 firmware_key_version, |
120 firmware_version, | 122 firmware_version, |
121 1, /* Firmware length. */ | 123 1, /* Firmware length. */ |
122 "testkeys/key_rsa8192.pem", | 124 "testkeys/key_rsa8192.pem", |
123 "testkeys/key_rsa1024.pem"); | 125 "testkeys/key_rsa1024.pem", |
| 126 'F'); |
124 if (!image) | 127 if (!image) |
125 return NULL; | 128 return NULL; |
126 if (is_corrupt) { | 129 if (is_corrupt) { |
127 /* Invalidate image. */ | 130 /* Invalidate image. */ |
128 Memset(image->firmware_data, 'X', image->firmware_len); | 131 Memset(image->firmware_data, 'X', image->firmware_len); |
129 } | 132 } |
130 | 133 |
131 firmware_blob = GetFirmwareBlob(image, &len); | 134 firmware_blob = GetFirmwareBlob(image, &len); |
132 FirmwareImageFree(image); | 135 FirmwareImageFree(image); |
133 return firmware_blob; | 136 return firmware_blob; |
134 } | 137 } |
135 | 138 |
136 | 139 |
137 KernelImage* GenerateTestKernelImage(int firmware_sign_algorithm, | 140 KernelImage* GenerateTestKernelImage(int firmware_sign_algorithm, |
138 int kernel_sign_algorithm, | 141 int kernel_sign_algorithm, |
139 const uint8_t* kernel_sign_key, | 142 const uint8_t* kernel_sign_key, |
140 int kernel_key_version, | 143 int kernel_key_version, |
141 int kernel_version, | 144 int kernel_version, |
142 int kernel_len, | 145 int kernel_len, |
143 const char* firmware_key_file, | 146 const char* firmware_key_file, |
144 const char* kernel_key_file) { | 147 const char* kernel_key_file, |
| 148 uint8_t kernel_data_fill_char) { |
145 KernelImage* image = KernelImageNew(); | 149 KernelImage* image = KernelImageNew(); |
146 | 150 |
147 Memcpy(image->magic, KERNEL_MAGIC, KERNEL_MAGIC_SIZE); | 151 Memcpy(image->magic, KERNEL_MAGIC, KERNEL_MAGIC_SIZE); |
148 image->header_version = 1; | 152 image->header_version = 1; |
149 image->firmware_sign_algorithm = firmware_sign_algorithm; | 153 image->firmware_sign_algorithm = firmware_sign_algorithm; |
150 image->kernel_sign_algorithm = kernel_sign_algorithm; | 154 image->kernel_sign_algorithm = kernel_sign_algorithm; |
151 image->kernel_key_version = kernel_key_version; | 155 image->kernel_key_version = kernel_key_version; |
152 image->kernel_sign_key = (uint8_t*) Malloc( | 156 image->kernel_sign_key = (uint8_t*) Malloc( |
153 RSAProcessedKeySize(image->kernel_sign_algorithm)); | 157 RSAProcessedKeySize(image->kernel_sign_algorithm)); |
154 Memcpy(image->kernel_sign_key, kernel_sign_key, | 158 Memcpy(image->kernel_sign_key, kernel_sign_key, |
155 RSAProcessedKeySize(image->kernel_sign_algorithm)); | 159 RSAProcessedKeySize(image->kernel_sign_algorithm)); |
156 | 160 |
157 /* Update correct header length. */ | 161 /* Update correct header length. */ |
158 image->header_len = GetKernelHeaderLen(image); | 162 image->header_len = GetKernelHeaderLen(image); |
159 | 163 |
160 /* Calculate SHA-512 digest on header and populate header_checksum. */ | 164 /* Calculate SHA-512 digest on header and populate header_checksum. */ |
161 CalculateKernelHeaderChecksum(image, image->header_checksum); | 165 CalculateKernelHeaderChecksum(image, image->header_checksum); |
162 | 166 |
163 /* Populate kernel options and data with dummy data. */ | 167 /* Populate kernel options and data with dummy data. */ |
164 image->kernel_version = kernel_version; | 168 image->kernel_version = kernel_version; |
165 image->options.version[0] = 1; | 169 image->options.version[0] = 1; |
166 image->options.version[1] = 0; | 170 image->options.version[1] = 0; |
167 Memset(image->options.cmd_line, 0, sizeof(image->options.cmd_line)); | 171 Memset(image->options.cmd_line, 0, sizeof(image->options.cmd_line)); |
168 image->options.kernel_len = kernel_len; | 172 image->options.kernel_len = kernel_len; |
169 image->options.kernel_load_addr = 0; | 173 image->options.kernel_load_addr = 0; |
170 image->options.kernel_entry_addr = 0; | 174 image->options.kernel_entry_addr = 0; |
171 image->kernel_key_signature = image->kernel_signature = NULL; | 175 image->kernel_key_signature = image->kernel_signature = NULL; |
172 image->kernel_data = Malloc(kernel_len); | 176 image->kernel_data = Malloc(kernel_len); |
173 Memset(image->kernel_data, 'F', kernel_len); | 177 Memset(image->kernel_data, kernel_data_fill_char, kernel_len); |
174 | 178 |
175 /* Generate and populate signatures. */ | 179 /* Generate and populate signatures. */ |
176 if (!AddKernelKeySignature(image, firmware_key_file)) { | 180 if (!AddKernelKeySignature(image, firmware_key_file)) { |
177 fprintf(stderr, "Couldn't create key signature.\n"); | 181 fprintf(stderr, "Couldn't create key signature.\n"); |
178 KernelImageFree(image); | 182 KernelImageFree(image); |
179 return NULL; | 183 return NULL; |
180 } | 184 } |
181 | 185 |
182 if (!AddKernelSignature(image, kernel_key_file)) { | 186 if (!AddKernelSignature(image, kernel_key_file)) { |
183 fprintf(stderr, "Couldn't create kernel option and kernel signature.\n"); | 187 fprintf(stderr, "Couldn't create kernel option and kernel signature.\n"); |
(...skipping 16 matching lines...) Expand all Loading... |
200 uint8_t* kernel_blob = NULL; | 204 uint8_t* kernel_blob = NULL; |
201 uint64_t kernel_blob_len = 0; | 205 uint64_t kernel_blob_len = 0; |
202 | 206 |
203 image = GenerateTestKernelImage(firmware_sign_algorithm, | 207 image = GenerateTestKernelImage(firmware_sign_algorithm, |
204 kernel_sign_algorithm, | 208 kernel_sign_algorithm, |
205 kernel_sign_key, | 209 kernel_sign_key, |
206 kernel_key_version, | 210 kernel_key_version, |
207 kernel_version, | 211 kernel_version, |
208 kernel_len, | 212 kernel_len, |
209 firmware_key_file, | 213 firmware_key_file, |
210 kernel_key_file); | 214 kernel_key_file, |
| 215 'K'); |
211 | 216 |
212 kernel_blob = GetKernelBlob(image, &kernel_blob_len); | 217 kernel_blob = GetKernelBlob(image, &kernel_blob_len); |
213 KernelImageFree(image); | 218 KernelImageFree(image); |
214 return kernel_blob; | 219 return kernel_blob; |
215 } | 220 } |
216 | 221 |
217 uint8_t* GenerateRollbackTestKernelBlob(int kernel_key_version, | 222 uint8_t* GenerateRollbackTestKernelBlob(int kernel_key_version, |
218 int kernel_version, | 223 int kernel_version, |
219 int is_corrupt) { | 224 int is_corrupt) { |
220 KernelImage* image = NULL; | 225 KernelImage* image = NULL; |
221 uint64_t len; | 226 uint64_t len; |
222 uint8_t* kernel_blob = NULL; | 227 uint8_t* kernel_blob = NULL; |
223 uint8_t* kernel_sign_key = NULL; | 228 uint8_t* kernel_sign_key = NULL; |
224 kernel_sign_key = BufferFromFile("testkeys/key_rsa1024.keyb", | 229 kernel_sign_key = BufferFromFile("testkeys/key_rsa1024.keyb", |
225 &len); | 230 &len); |
226 if (!kernel_sign_key) | 231 if (!kernel_sign_key) |
227 return NULL; | 232 return NULL; |
228 image = GenerateTestKernelImage(0, /* Firmware algo: RSA1024/SHA1 */ | 233 image = GenerateTestKernelImage(0, /* Firmware algo: RSA1024/SHA1 */ |
229 0, /* Kernel algo: RSA1024/SHA1 */ | 234 0, /* Kernel algo: RSA1024/SHA1 */ |
230 kernel_sign_key, | 235 kernel_sign_key, |
231 kernel_key_version, | 236 kernel_key_version, |
232 kernel_version, | 237 kernel_version, |
233 1, /* kernel length. */ | 238 1, /* kernel length. */ |
234 "testkeys/key_rsa1024.pem", | 239 "testkeys/key_rsa1024.pem", |
235 "testkeys/key_rsa1024.pem"); | 240 "testkeys/key_rsa1024.pem", |
| 241 'K'); |
236 if (!image) | 242 if (!image) |
237 return NULL; | 243 return NULL; |
238 if (is_corrupt) { | 244 if (is_corrupt) { |
239 /* Invalidate image. */ | 245 /* Invalidate image. */ |
240 Memset(image->kernel_data, 'X', image->options.kernel_len); | 246 Memset(image->kernel_data, 'X', image->options.kernel_len); |
241 } | 247 } |
242 kernel_blob = GetKernelBlob(image, &len); | 248 kernel_blob = GetKernelBlob(image, &len); |
243 KernelImageFree(image); | 249 KernelImageFree(image); |
244 return kernel_blob; | 250 return kernel_blob; |
245 } | 251 } |
OLD | NEW |