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 * 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 29 matching lines...) Expand all Loading... | |
40 if (image) { | 40 if (image) { |
41 Free(image->firmware_sign_key); | 41 Free(image->firmware_sign_key); |
42 Free(image->preamble_signature); | 42 Free(image->preamble_signature); |
43 Free(image->firmware_signature); | 43 Free(image->firmware_signature); |
44 Free(image->firmware_data); | 44 Free(image->firmware_data); |
45 Free(image); | 45 Free(image); |
46 } | 46 } |
47 } | 47 } |
48 | 48 |
49 FirmwareImage* ReadFirmwareImage(const char* input_file) { | 49 FirmwareImage* ReadFirmwareImage(const char* input_file) { |
50 uint32_t file_size; | 50 uint64_t file_size; |
51 int image_len = 0; /* Total size of the firmware image. */ | 51 int image_len = 0; /* Total size of the firmware image. */ |
52 int header_len = 0; | 52 int header_len = 0; |
53 int firmware_sign_key_len; | 53 int firmware_sign_key_len; |
54 int signature_len; | 54 int signature_len; |
Chris Masone
2010/03/11 02:30:46
what about the above? Are they all ok to be < 64
gauravsh
2010/03/11 02:33:39
Yes, these are always going to be bounded.
| |
55 uint8_t* firmware_buf; | 55 uint8_t* firmware_buf; |
56 MemcpyState st; | 56 MemcpyState st; |
57 FirmwareImage* image = FirmwareImageNew(); | 57 FirmwareImage* image = FirmwareImageNew(); |
58 | 58 |
59 if (!image) | 59 if (!image) |
60 return NULL; | 60 return NULL; |
61 | 61 |
62 firmware_buf = BufferFromFile(input_file, &file_size); | 62 firmware_buf = BufferFromFile(input_file, &file_size); |
63 image_len = file_size; | 63 image_len = file_size; |
64 | 64 |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
181 StatefulMemcpy_r(&st, image->preamble, FIELD_LEN(preamble)); | 181 StatefulMemcpy_r(&st, image->preamble, FIELD_LEN(preamble)); |
182 | 182 |
183 if (st.remaining_len != 0 ) { /* Underrun or Overrun. */ | 183 if (st.remaining_len != 0 ) { /* Underrun or Overrun. */ |
184 Free(preamble_blob); | 184 Free(preamble_blob); |
185 return NULL; | 185 return NULL; |
186 } | 186 } |
187 return preamble_blob; | 187 return preamble_blob; |
188 } | 188 } |
189 | 189 |
190 | 190 |
191 uint8_t* GetFirmwareBlob(const FirmwareImage* image, int* blob_len) { | 191 uint8_t* GetFirmwareBlob(const FirmwareImage* image, uint64_t* blob_len) { |
192 int firmware_signature_len; | 192 int firmware_signature_len; |
193 uint8_t* firmware_blob = NULL; | 193 uint8_t* firmware_blob = NULL; |
194 uint8_t* header_blob = NULL; | 194 uint8_t* header_blob = NULL; |
195 uint8_t* preamble_blob = NULL; | 195 uint8_t* preamble_blob = NULL; |
196 MemcpyState st; | 196 MemcpyState st; |
197 | 197 |
198 if (!image) | 198 if (!image) |
199 return NULL; | 199 return NULL; |
200 | 200 |
201 firmware_signature_len = siglen_map[image->firmware_sign_algorithm]; | 201 firmware_signature_len = siglen_map[image->firmware_sign_algorithm]; |
(...skipping 26 matching lines...) Expand all Loading... | |
228 Free(firmware_blob); | 228 Free(firmware_blob); |
229 return NULL; | 229 return NULL; |
230 } | 230 } |
231 return firmware_blob; | 231 return firmware_blob; |
232 } | 232 } |
233 | 233 |
234 int WriteFirmwareImage(const char* input_file, | 234 int WriteFirmwareImage(const char* input_file, |
235 const FirmwareImage* image) { | 235 const FirmwareImage* image) { |
236 int fd; | 236 int fd; |
237 uint8_t* firmware_blob; | 237 uint8_t* firmware_blob; |
238 int blob_len; | 238 uint64_t blob_len; |
239 | 239 |
240 if (!image) | 240 if (!image) |
241 return 0; | 241 return 0; |
242 if (-1 == (fd = creat(input_file, S_IRWXU))) { | 242 if (-1 == (fd = creat(input_file, S_IRWXU))) { |
243 fprintf(stderr, "Couldn't open file for writing.\n"); | 243 fprintf(stderr, "Couldn't open file for writing.\n"); |
244 return 0; | 244 return 0; |
245 } | 245 } |
246 | 246 |
247 firmware_blob = GetFirmwareBlob(image, &blob_len); | 247 firmware_blob = GetFirmwareBlob(image, &blob_len); |
248 if (!firmware_blob) { | 248 if (!firmware_blob) { |
(...skipping 20 matching lines...) Expand all Loading... | |
269 "Algorithm Id = %d\n" | 269 "Algorithm Id = %d\n" |
270 "Signature Algorithm = %s\n" | 270 "Signature Algorithm = %s\n" |
271 "Key Version = %d\n\n", | 271 "Key Version = %d\n\n", |
272 image->header_len, | 272 image->header_len, |
273 image->firmware_sign_algorithm, | 273 image->firmware_sign_algorithm, |
274 algo_strings[image->firmware_sign_algorithm], | 274 algo_strings[image->firmware_sign_algorithm], |
275 image->firmware_key_version); | 275 image->firmware_key_version); |
276 /* TODO(gauravsh): Output hash and key signature here? */ | 276 /* TODO(gauravsh): Output hash and key signature here? */ |
277 /* Print preamble. */ | 277 /* Print preamble. */ |
278 printf("Firmware Version = %d\n" | 278 printf("Firmware Version = %d\n" |
279 "Firmware Length = %d\n\n", | 279 "Firmware Length = %" PRIu64 "\n\n", |
280 image->firmware_version, | 280 image->firmware_version, |
281 image->firmware_len); | 281 image->firmware_len); |
282 /* Output key signature here? */ | 282 /* Output key signature here? */ |
283 } | 283 } |
284 | 284 |
285 char* kVerifyFirmwareErrors[VERIFY_FIRMWARE_MAX] = { | 285 char* kVerifyFirmwareErrors[VERIFY_FIRMWARE_MAX] = { |
286 "Success.", | 286 "Success.", |
287 "Invalid Image.", | 287 "Invalid Image.", |
288 "Root Key Signature Failed.", | 288 "Root Key Signature Failed.", |
289 "Invalid Verification Algorithm.", | 289 "Invalid Verification Algorithm.", |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
579 if (!(firmware_signature = SignatureBuf(image->firmware_data, | 579 if (!(firmware_signature = SignatureBuf(image->firmware_data, |
580 image->firmware_len, | 580 image->firmware_len, |
581 signing_key_file, | 581 signing_key_file, |
582 image->firmware_sign_algorithm))) | 582 image->firmware_sign_algorithm))) |
583 return 0; | 583 return 0; |
584 image->firmware_signature = (uint8_t*) Malloc(signature_len); | 584 image->firmware_signature = (uint8_t*) Malloc(signature_len); |
585 Memcpy(image->firmware_signature, firmware_signature, signature_len); | 585 Memcpy(image->firmware_signature, firmware_signature, signature_len); |
586 Free(firmware_signature); | 586 Free(firmware_signature); |
587 return 1; | 587 return 1; |
588 } | 588 } |
OLD | NEW |