| 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 // Utility for manipulating verified boot kernel images. | 5 // Utility for manipulating verified boot kernel images. |
| 6 // | 6 // |
| 7 | 7 |
| 8 #include "kernel_utility.h" | 8 #include "kernel_utility.h" |
| 9 | 9 |
| 10 #include <errno.h> | 10 #include <errno.h> |
| 11 #include <getopt.h> | 11 #include <getopt.h> |
| 12 #include <stdio.h> | 12 #include <stdio.h> |
| 13 #include <stdint.h> // Needed for UINT16_MAX. | 13 #include <stdint.h> // Needed for UINT16_MAX. |
| 14 #include <stdlib.h> | 14 #include <stdlib.h> |
| 15 #include <unistd.h> | 15 #include <unistd.h> |
| 16 | 16 |
| 17 #include <iostream> | 17 #include <iostream> |
| 18 | 18 |
| 19 extern "C" { | 19 extern "C" { |
| 20 #include "cryptolib.h" | 20 #include "cryptolib.h" |
| 21 #include "file_keys.h" | 21 #include "file_keys.h" |
| 22 #include "kernel_image.h" | 22 #include "kernel_image.h" |
| 23 #include "utility.h" | 23 #include "stateful_util.h" |
| 24 } | 24 } |
| 25 | 25 |
| 26 extern int errno; | 26 extern int errno; |
| 27 using std::cerr; | 27 using std::cerr; |
| 28 | 28 |
| 29 // Macro to determine the size of a field structure in the KernelImage |
| 30 // structure. |
| 31 #define FIELD_LEN(field) (sizeof(((KernelImage*)0)->field)) |
| 32 |
| 29 namespace vboot_reference { | 33 namespace vboot_reference { |
| 30 | 34 |
| 31 KernelUtility::KernelUtility(): image_(NULL), | 35 KernelUtility::KernelUtility(): image_(NULL), |
| 32 firmware_key_pub_(NULL), | 36 firmware_key_pub_(NULL), |
| 33 header_version_(1), | 37 header_version_(1), |
| 34 firmware_sign_algorithm_(-1), | 38 firmware_sign_algorithm_(-1), |
| 35 kernel_sign_algorithm_(-1), | 39 kernel_sign_algorithm_(-1), |
| 36 kernel_key_version_(-1), | 40 kernel_key_version_(-1), |
| 37 kernel_version_(-1), | 41 kernel_version_(-1), |
| 38 padding_(0), | 42 padding_(0), |
| 39 kernel_len_(0), | 43 kernel_len_(0), |
| 40 is_generate_(false), | 44 is_generate_(false), |
| 41 is_verify_(false), | 45 is_verify_(false), |
| 42 is_describe_(false), | 46 is_describe_(false), |
| 43 is_only_vblock_(false) { | 47 is_only_vblock_(false) {} |
| 44 } | |
| 45 | 48 |
| 46 KernelUtility::~KernelUtility() { | 49 KernelUtility::~KernelUtility() { |
| 47 RSAPublicKeyFree(firmware_key_pub_); | 50 RSAPublicKeyFree(firmware_key_pub_); |
| 48 KernelImageFree(image_); | 51 KernelImageFree(image_); |
| 49 } | 52 } |
| 50 | 53 |
| 51 void KernelUtility::PrintUsage(void) { | 54 void KernelUtility::PrintUsage(void) { |
| 52 cerr << "\n" | 55 cerr << "\n" |
| 53 "Utility to generate/verify/describe a verified boot kernel image\n" | 56 "Utility to generate/verify/describe a verified boot kernel image\n" |
| 54 "\n" | 57 "\n" |
| 55 "Usage: kernel_utility <--generate|--verify|--describe> [OPTIONS]\n" | 58 "Usage: kernel_utility <--generate|--verify|--describe> [OPTIONS]\n" |
| 56 "\n" | 59 "\n" |
| 57 "For \"--describe\", the required OPTIONS are:\n" | 60 "For \"--describe\", the required OPTIONS are:\n" |
| 58 " --in <infile>\t\t\t\tSigned boot image to describe.\n" | 61 " --in <infile>\t\t\t\tSigned boot image to describe.\n" |
| 59 "\n" | 62 "\n" |
| 60 "For \"--verify\", required OPTIONS are:\n" | 63 "For \"--verify\", required OPTIONS are:\n" |
| 61 " --in <infile>\t\t\t\tSigned boot image to verify.\n" | 64 " --in <infile>\t\t\t\tSigned boot image to verify.\n" |
| 62 " --firmware_key_pub <pubkeyfile>\tPre-processed public firmware key\n" | 65 " --firmware_key_pub <pubkeyfile>\tPre-processed public firmware key\n" |
| 63 "\n" | 66 "\n" |
| 64 "For \"--generate\", required OPTIONS are:\n" | 67 "For \"--generate\", required OPTIONS are:\n" |
| 65 " --firmware_key <privkeyfile>\t\tPrivate firmware signing key file\n" | 68 " --firmware_key <privkeyfile>\t\tPrivate firmware signing key file\n" |
| 66 " --kernel_key <privkeyfile>\t\tPrivate kernel signing key file\n" | |
| 67 " --kernel_key_pub <pubkeyfile>\t\tPre-processed public kernel signing" | 69 " --kernel_key_pub <pubkeyfile>\t\tPre-processed public kernel signing" |
| 68 " key\n" | 70 " key\n" |
| 69 " --firmware_sign_algorithm <algoid>\tSigning algorithm for firmware\n" | 71 " --firmware_sign_algorithm <algoid>\tSigning algorithm for firmware\n" |
| 70 " --kernel_sign_algorithm <algoid>\tSigning algorithm for kernel\n" | 72 " --kernel_sign_algorithm <algoid>\tSigning algorithm for kernel\n" |
| 71 " --kernel_key_version <number>\t\tKernel signing key version number\n" | 73 " --kernel_key_version <number>\t\tKernel signing key version number\n" |
| 74 "OR\n" |
| 75 " --subkey_in <subkeyfile>\t\tExisting key signature header\n" |
| 76 "\n" |
| 77 " --kernel_key <privkeyfile>\t\tPrivate kernel signing key file\n" |
| 72 " --kernel_version <number>\t\tKernel Version number\n" | 78 " --kernel_version <number>\t\tKernel Version number\n" |
| 73 " --config <file>\t\t\tEmbedded kernel command-line parameters\n" | 79 " --config <file>\t\t\tEmbedded kernel command-line parameters\n" |
| 74 " --bootloader <file>\t\t\tEmbedded bootloader stub\n" | 80 " --bootloader <file>\t\t\tEmbedded bootloader stub\n" |
| 75 " --vmlinuz <file>\t\t\tEmbedded kernel image\n" | 81 " --vmlinuz <file>\t\t\tEmbedded kernel image\n" |
| 76 " --out <outfile>\t\t\tOutput file for verified boot image\n" | 82 " --out <outfile>\t\t\tOutput file for verified boot image\n" |
| 77 "\n" | 83 "\n" |
| 78 "Optional arguments for \"--generate\" are:\n" | 84 "Optional arguments for \"--generate\" are:\n" |
| 79 " --padding <size>\t\t\tPad the header to this size\n" | 85 " --padding <size>\t\t\tPad the header to this size\n" |
| 80 " --subkey_out\t\t\t\tJust output the subkey (key verification) header\n" | 86 " --subkey_out\t\t\t\tJust output the subkey (key verification) header\n" |
| 81 " --vblock\t\t\t\tJust output the verification block\n" | 87 " --vblock\t\t\t\tJust output the verification block\n" |
| 82 "\n" | 88 "\n" |
| 83 "<algoid> (for --*_sign_algorithm) is one of the following:\n"; | 89 "<algoid> (for --*_sign_algorithm) is one of the following:\n"; |
| 84 for (int i = 0; i < kNumAlgorithms; i++) { | 90 for (int i = 0; i < kNumAlgorithms; i++) { |
| 85 cerr << " " << i << " for " << algo_strings[i] << "\n"; | 91 cerr << " " << i << " for " << algo_strings[i] << "\n"; |
| 86 } | 92 } |
| 87 cerr << "\n\n"; | 93 cerr << "\n\n"; |
| 88 } | 94 } |
| 89 | 95 |
| 90 bool KernelUtility::ParseCmdLineOptions(int argc, char* argv[]) { | 96 bool KernelUtility::ParseCmdLineOptions(int argc, char* argv[]) { |
| 91 int option_index, i; | 97 int option_index, i; |
| 92 char *e = 0; | 98 char *e = 0; |
| 93 enum { | 99 enum { |
| 94 OPT_FIRMWARE_KEY = 1000, | 100 OPT_FIRMWARE_KEY = 1000, |
| 95 OPT_FIRMWARE_KEY_PUB, | 101 OPT_FIRMWARE_KEY_PUB, |
| 96 OPT_KERNEL_KEY, | 102 OPT_KERNEL_KEY, |
| 97 OPT_KERNEL_KEY_PUB, | 103 OPT_KERNEL_KEY_PUB, |
| 104 OPT_SUBKEY_IN, |
| 98 OPT_FIRMWARE_SIGN_ALGORITHM, | 105 OPT_FIRMWARE_SIGN_ALGORITHM, |
| 99 OPT_KERNEL_SIGN_ALGORITHM, | 106 OPT_KERNEL_SIGN_ALGORITHM, |
| 100 OPT_KERNEL_KEY_VERSION, | 107 OPT_KERNEL_KEY_VERSION, |
| 101 OPT_KERNEL_VERSION, | 108 OPT_KERNEL_VERSION, |
| 102 OPT_IN, | 109 OPT_IN, |
| 103 OPT_OUT, | 110 OPT_OUT, |
| 104 OPT_GENERATE, | 111 OPT_GENERATE, |
| 105 OPT_VERIFY, | 112 OPT_VERIFY, |
| 106 OPT_DESCRIBE, | 113 OPT_DESCRIBE, |
| 107 OPT_VBLOCK, | 114 OPT_VBLOCK, |
| 108 OPT_BOOTLOADER, | 115 OPT_BOOTLOADER, |
| 109 OPT_VMLINUZ, | 116 OPT_VMLINUZ, |
| 110 OPT_CONFIG, | 117 OPT_CONFIG, |
| 111 OPT_PADDING, | 118 OPT_PADDING, |
| 112 OPT_SUBKEY, | 119 OPT_SUBKEY, |
| 113 }; | 120 }; |
| 114 static struct option long_options[] = { | 121 static struct option long_options[] = { |
| 115 {"firmware_key", 1, 0, OPT_FIRMWARE_KEY }, | 122 {"firmware_key", 1, 0, OPT_FIRMWARE_KEY }, |
| 116 {"firmware_key_pub", 1, 0, OPT_FIRMWARE_KEY_PUB }, | 123 {"firmware_key_pub", 1, 0, OPT_FIRMWARE_KEY_PUB }, |
| 117 {"kernel_key", 1, 0, OPT_KERNEL_KEY }, | 124 {"kernel_key", 1, 0, OPT_KERNEL_KEY }, |
| 118 {"kernel_key_pub", 1, 0, OPT_KERNEL_KEY_PUB }, | 125 {"kernel_key_pub", 1, 0, OPT_KERNEL_KEY_PUB }, |
| 126 {"subkey_in", 1, 0, OPT_SUBKEY_IN }, |
| 119 {"firmware_sign_algorithm", 1, 0, OPT_FIRMWARE_SIGN_ALGORITHM }, | 127 {"firmware_sign_algorithm", 1, 0, OPT_FIRMWARE_SIGN_ALGORITHM }, |
| 120 {"kernel_sign_algorithm", 1, 0, OPT_KERNEL_SIGN_ALGORITHM }, | 128 {"kernel_sign_algorithm", 1, 0, OPT_KERNEL_SIGN_ALGORITHM }, |
| 121 {"kernel_key_version", 1, 0, OPT_KERNEL_KEY_VERSION }, | 129 {"kernel_key_version", 1, 0, OPT_KERNEL_KEY_VERSION }, |
| 122 {"kernel_version", 1, 0, OPT_KERNEL_VERSION }, | 130 {"kernel_version", 1, 0, OPT_KERNEL_VERSION }, |
| 123 {"in", 1, 0, OPT_IN }, | 131 {"in", 1, 0, OPT_IN }, |
| 124 {"out", 1, 0, OPT_OUT }, | 132 {"out", 1, 0, OPT_OUT }, |
| 125 {"generate", 0, 0, OPT_GENERATE }, | 133 {"generate", 0, 0, OPT_GENERATE }, |
| 126 {"verify", 0, 0, OPT_VERIFY }, | 134 {"verify", 0, 0, OPT_VERIFY }, |
| 127 {"describe", 0, 0, OPT_DESCRIBE }, | 135 {"describe", 0, 0, OPT_DESCRIBE }, |
| 128 {"vblock", 0, 0, OPT_VBLOCK }, | 136 {"vblock", 0, 0, OPT_VBLOCK }, |
| (...skipping 14 matching lines...) Expand all Loading... |
| 143 break; | 151 break; |
| 144 case OPT_FIRMWARE_KEY_PUB: | 152 case OPT_FIRMWARE_KEY_PUB: |
| 145 firmware_key_pub_file_ = optarg; | 153 firmware_key_pub_file_ = optarg; |
| 146 break; | 154 break; |
| 147 case OPT_KERNEL_KEY: | 155 case OPT_KERNEL_KEY: |
| 148 kernel_key_file_ = optarg; | 156 kernel_key_file_ = optarg; |
| 149 break; | 157 break; |
| 150 case OPT_KERNEL_KEY_PUB: | 158 case OPT_KERNEL_KEY_PUB: |
| 151 kernel_key_pub_file_ = optarg; | 159 kernel_key_pub_file_ = optarg; |
| 152 break; | 160 break; |
| 161 case OPT_SUBKEY_IN: |
| 162 subkey_in_file_ = optarg; |
| 163 break; |
| 153 case OPT_FIRMWARE_SIGN_ALGORITHM: | 164 case OPT_FIRMWARE_SIGN_ALGORITHM: |
| 154 firmware_sign_algorithm_ = strtol(optarg, &e, 0); | 165 firmware_sign_algorithm_ = strtol(optarg, &e, 0); |
| 155 if (!*optarg || (e && *e)) { | 166 if (!*optarg || (e && *e)) { |
| 156 cerr << "Invalid argument to --" | 167 cerr << "Invalid argument to --" |
| 157 << long_options[option_index].name | 168 << long_options[option_index].name |
| 158 << ": " << optarg << "\n"; | 169 << ": " << optarg << "\n"; |
| 159 return false; | 170 return false; |
| 160 } | 171 } |
| 161 break; | 172 break; |
| 162 case OPT_KERNEL_SIGN_ALGORITHM: | 173 case OPT_KERNEL_SIGN_ALGORITHM: |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 248 image_ = ReadKernelImage(in_file_.c_str()); | 259 image_ = ReadKernelImage(in_file_.c_str()); |
| 249 if (!image_) { | 260 if (!image_) { |
| 250 cerr << "Couldn't read kernel image or malformed image.\n"; | 261 cerr << "Couldn't read kernel image or malformed image.\n"; |
| 251 return; | 262 return; |
| 252 } | 263 } |
| 253 PrintKernelImage(image_); | 264 PrintKernelImage(image_); |
| 254 } | 265 } |
| 255 | 266 |
| 256 bool KernelUtility::GenerateSignedImage(void) { | 267 bool KernelUtility::GenerateSignedImage(void) { |
| 257 uint64_t kernel_key_pub_len; | 268 uint64_t kernel_key_pub_len; |
| 269 |
| 258 image_ = KernelImageNew(); | 270 image_ = KernelImageNew(); |
| 259 | |
| 260 Memcpy(image_->magic, KERNEL_MAGIC, KERNEL_MAGIC_SIZE); | 271 Memcpy(image_->magic, KERNEL_MAGIC, KERNEL_MAGIC_SIZE); |
| 261 | 272 |
| 262 // TODO(gauravsh): make this a command line option. | 273 if (subkey_in_file_.empty()) { |
| 263 image_->header_version = 1; | 274 // We must generate the kernel key signature header (subkey header) |
| 275 // ourselves. |
| 276 image_->header_version = 1; |
| 277 image_->firmware_sign_algorithm = (uint16_t) firmware_sign_algorithm_; |
| 278 // Copy pre-processed public signing key. |
| 279 image_->kernel_sign_algorithm = (uint16_t) kernel_sign_algorithm_; |
| 280 image_->kernel_sign_key = BufferFromFile(kernel_key_pub_file_.c_str(), |
| 281 &kernel_key_pub_len); |
| 282 if (!image_->kernel_sign_key) |
| 283 return false; |
| 284 image_->kernel_key_version = kernel_key_version_; |
| 285 |
| 286 // Update header length. |
| 287 image_->header_len = GetKernelHeaderLen(image_); |
| 288 // Calculate header checksum. |
| 289 CalculateKernelHeaderChecksum(image_, image_->header_checksum); |
| 290 |
| 291 // Generate and add the signatures. |
| 292 if (!AddKernelKeySignature(image_, firmware_key_file_.c_str())) { |
| 293 cerr << "Couldn't write key signature to verified boot kernel image.\n"; |
| 294 return false; |
| 295 } |
| 296 } else { |
| 297 // Use existing subkey header. |
| 298 MemcpyState st; |
| 299 uint8_t* subkey_header_buf = NULL; |
| 300 uint64_t subkey_len; |
| 301 int header_len; |
| 302 int kernel_key_signature_len; |
| 303 int kernel_sign_key_len; |
| 304 uint8_t header_checksum[FIELD_LEN(header_checksum)]; |
| 305 |
| 306 subkey_header_buf = BufferFromFile(subkey_in_file_.c_str(), &subkey_len); |
| 307 if (!subkey_header_buf) { |
| 308 cerr << "Couldn't read subkey header from file %s\n" |
| 309 << subkey_in_file_.c_str(); |
| 310 return false; |
| 311 } |
| 312 st.remaining_len = subkey_len; |
| 313 st.remaining_buf = subkey_header_buf; |
| 314 st.overrun = 0; |
| 315 |
| 316 // TODO(gauravsh): This is basically the same code as the first half of |
| 317 // of ReadKernelImage(). Refactor to eliminate code duplication. |
| 318 |
| 319 StatefulMemcpy(&st, &image_->header_version, FIELD_LEN(header_version)); |
| 320 StatefulMemcpy(&st, &image_->header_len, FIELD_LEN(header_len)); |
| 321 StatefulMemcpy(&st, &image_->firmware_sign_algorithm, |
| 322 FIELD_LEN(firmware_sign_algorithm)); |
| 323 StatefulMemcpy(&st, &image_->kernel_sign_algorithm, |
| 324 FIELD_LEN(kernel_sign_algorithm)); |
| 325 |
| 326 /* Valid Kernel Key signing algorithm. */ |
| 327 if (image_->firmware_sign_algorithm >= kNumAlgorithms) { |
| 328 Free(subkey_header_buf); |
| 329 return NULL; |
| 330 } |
| 331 |
| 332 /* Valid Kernel Signing Algorithm? */ |
| 333 if (image_->kernel_sign_algorithm >= kNumAlgorithms) { |
| 334 Free(subkey_header_buf); |
| 335 return NULL; |
| 336 } |
| 337 |
| 338 /* Compute size of pre-processed RSA public keys and signatures. */ |
| 339 kernel_key_signature_len = siglen_map[image_->firmware_sign_algorithm]; |
| 340 kernel_sign_key_len = RSAProcessedKeySize(image_->kernel_sign_algorithm); |
| 341 |
| 342 /* Check whether key header length is correct. */ |
| 343 header_len = GetKernelHeaderLen(image_); |
| 344 if (header_len != image_->header_len) { |
| 345 debug("Header length mismatch. Got: %d, Expected: %d\n", |
| 346 image_->header_len, header_len); |
| 347 Free(subkey_header_buf); |
| 348 return NULL; |
| 349 } |
| 350 |
| 351 /* Read pre-processed public half of the kernel signing key. */ |
| 352 StatefulMemcpy(&st, &image_->kernel_key_version, |
| 353 FIELD_LEN(kernel_key_version)); |
| 354 image_->kernel_sign_key = (uint8_t*) Malloc(kernel_sign_key_len); |
| 355 StatefulMemcpy(&st, image_->kernel_sign_key, kernel_sign_key_len); |
| 356 StatefulMemcpy(&st, image_->header_checksum, FIELD_LEN(header_checksum)); |
| 357 |
| 358 /* Check whether the header checksum matches. */ |
| 359 CalculateKernelHeaderChecksum(image_, header_checksum); |
| 360 if (SafeMemcmp(header_checksum, image_->header_checksum, |
| 361 FIELD_LEN(header_checksum))) { |
| 362 debug("Invalid kernel header checksum!\n"); |
| 363 Free(subkey_header_buf); |
| 364 return NULL; |
| 365 } |
| 366 |
| 367 /* Read key signature. */ |
| 368 image_->kernel_key_signature = (uint8_t*) Malloc(kernel_key_signature_len); |
| 369 StatefulMemcpy(&st, image_->kernel_key_signature, |
| 370 kernel_key_signature_len); |
| 371 Free(subkey_header_buf); |
| 372 if (st.overrun || st.remaining_len != 0) /* Overrun or underrun. */ |
| 373 return false; |
| 374 return true; |
| 375 } |
| 376 |
| 377 // Fill up kernel preamble and kernel data. |
| 378 image_->kernel_version = kernel_version_; |
| 264 if (padding_) | 379 if (padding_) |
| 265 image_->padded_header_size = padding_; | 380 image_->padded_header_size = padding_; |
| 266 image_->firmware_sign_algorithm = (uint16_t) firmware_sign_algorithm_; | |
| 267 // Copy pre-processed public signing key. | |
| 268 image_->kernel_sign_algorithm = (uint16_t) kernel_sign_algorithm_; | |
| 269 image_->kernel_sign_key = BufferFromFile(kernel_key_pub_file_.c_str(), | |
| 270 &kernel_key_pub_len); | |
| 271 if (!image_->kernel_sign_key) | |
| 272 return false; | |
| 273 image_->kernel_key_version = kernel_key_version_; | |
| 274 | |
| 275 // Update header length. | |
| 276 image_->header_len = GetKernelHeaderLen(image_); | |
| 277 | |
| 278 // Calculate header checksum. | |
| 279 CalculateKernelHeaderChecksum(image_, image_->header_checksum); | |
| 280 | |
| 281 image_->kernel_version = kernel_version_; | |
| 282 | |
| 283 image_->kernel_data = GenerateKernelBlob(vmlinuz_file_.c_str(), | 381 image_->kernel_data = GenerateKernelBlob(vmlinuz_file_.c_str(), |
| 284 config_file_.c_str(), | 382 config_file_.c_str(), |
| 285 bootloader_file_.c_str(), | 383 bootloader_file_.c_str(), |
| 286 &image_->kernel_len, | 384 &image_->kernel_len, |
| 287 &image_->bootloader_offset, | 385 &image_->bootloader_offset, |
| 288 &image_->bootloader_size); | 386 &image_->bootloader_size); |
| 289 if (!image_->kernel_data) | 387 if (!image_->kernel_data) |
| 290 return false; | 388 return false; |
| 291 // Generate and add the signatures. | |
| 292 if (!AddKernelKeySignature(image_, firmware_key_file_.c_str())) { | |
| 293 cerr << "Couldn't write key signature to verified boot kernel image.\n"; | |
| 294 return false; | |
| 295 } | |
| 296 | 389 |
| 297 if (!AddKernelSignature(image_, kernel_key_file_.c_str())) { | 390 if (!AddKernelSignature(image_, kernel_key_file_.c_str())) { |
| 298 cerr << "Couldn't write firmware signature to verified boot kernel image.\n"
; | 391 cerr << "Couldn't write firmware signature to verified boot kernel image.\n"
; |
| 299 return false; | 392 return false; |
| 300 } | 393 } |
| 301 return true; | 394 return true; |
| 302 } | 395 } |
| 303 | 396 |
| 304 bool KernelUtility::VerifySignedImage(void) { | 397 bool KernelUtility::VerifySignedImage(void) { |
| 305 int error; | 398 int error; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 cerr << "No pre-processed public firmware key file specified.\n"; | 437 cerr << "No pre-processed public firmware key file specified.\n"; |
| 345 return false; | 438 return false; |
| 346 } | 439 } |
| 347 if (in_file_.empty()) { | 440 if (in_file_.empty()) { |
| 348 cerr << "No input file specified.\n"; | 441 cerr << "No input file specified.\n"; |
| 349 return false; | 442 return false; |
| 350 } | 443 } |
| 351 } | 444 } |
| 352 // Required options for --generate. | 445 // Required options for --generate. |
| 353 if (is_generate_) { | 446 if (is_generate_) { |
| 354 if (firmware_key_file_.empty()) { | 447 if (subkey_in_file_.empty()) { |
| 355 cerr << "No firmware key file specified.\n"; | 448 // Firmware private key (root key), kernel signing public |
| 356 return false; | 449 // key, and signing algorithms are required to generate the key signature |
| 450 // header. |
| 451 if (firmware_key_file_.empty()) { |
| 452 cerr << "No firmware key file specified.\n"; |
| 453 return false; |
| 454 } |
| 455 if (kernel_key_pub_file_.empty()) { |
| 456 cerr << "No pre-processed public kernel key file specified\n"; |
| 457 return false; |
| 458 } |
| 459 if (kernel_key_version_ <= 0 || kernel_key_version_ > UINT16_MAX) { |
| 460 cerr << "Invalid or no kernel key version specified.\n"; |
| 461 return false; |
| 462 } |
| 463 if (firmware_sign_algorithm_ < 0 || |
| 464 firmware_sign_algorithm_ >= kNumAlgorithms) { |
| 465 cerr << "Invalid or no firmware signing key algorithm specified.\n"; |
| 466 return false; |
| 467 } |
| 468 if (kernel_sign_algorithm_ < 0 || |
| 469 kernel_sign_algorithm_ >= kNumAlgorithms) { |
| 470 cerr << "Invalid or no kernel signing key algorithm specified.\n"; |
| 471 return false; |
| 472 } |
| 357 } | 473 } |
| 358 if (kernel_key_file_.empty()) { | 474 if (kernel_key_file_.empty()) { |
| 359 cerr << "No kernel key file specified.\n"; | 475 cerr << "No kernel key file specified.\n"; |
| 360 return false; | 476 return false; |
| 361 } | 477 } |
| 362 if (kernel_key_pub_file_.empty()) { | |
| 363 cerr << "No pre-processed public kernel key file specified\n"; | |
| 364 return false; | |
| 365 } | |
| 366 if (kernel_key_version_ <= 0 || kernel_key_version_ > UINT16_MAX) { | |
| 367 cerr << "Invalid or no kernel key version specified.\n"; | |
| 368 return false; | |
| 369 } | |
| 370 if (firmware_sign_algorithm_ < 0 || | |
| 371 firmware_sign_algorithm_ >= kNumAlgorithms) { | |
| 372 cerr << "Invalid or no firmware signing key algorithm specified.\n"; | |
| 373 return false; | |
| 374 } | |
| 375 if (kernel_sign_algorithm_ < 0 || | |
| 376 kernel_sign_algorithm_ >= kNumAlgorithms) { | |
| 377 cerr << "Invalid or no kernel signing key algorithm specified.\n"; | |
| 378 return false; | |
| 379 } | |
| 380 if (kernel_version_ <=0 || kernel_version_ > UINT16_MAX) { | 478 if (kernel_version_ <=0 || kernel_version_ > UINT16_MAX) { |
| 381 cerr << "Invalid or no kernel version specified.\n"; | 479 cerr << "Invalid or no kernel version specified.\n"; |
| 382 return false; | 480 return false; |
| 383 } | 481 } |
| 384 if (out_file_.empty()) { | 482 if (out_file_.empty()) { |
| 385 cerr <<"No output file specified.\n"; | 483 cerr <<"No output file specified.\n"; |
| 386 return false; | 484 return false; |
| 387 } | 485 } |
| 388 if (config_file_.empty()) { | 486 if (config_file_.empty()) { |
| 389 cerr << "No config file specified.\n"; | 487 cerr << "No config file specified.\n"; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 420 } | 518 } |
| 421 else if (ku.is_verify()) { | 519 else if (ku.is_verify()) { |
| 422 cerr << "Verification "; | 520 cerr << "Verification "; |
| 423 if (ku.VerifySignedImage()) | 521 if (ku.VerifySignedImage()) |
| 424 cerr << "SUCCESS.\n"; | 522 cerr << "SUCCESS.\n"; |
| 425 else | 523 else |
| 426 cerr << "FAILURE.\n"; | 524 cerr << "FAILURE.\n"; |
| 427 } | 525 } |
| 428 return 0; | 526 return 0; |
| 429 } | 527 } |
| OLD | NEW |