Vboot Reference: Refactor Code.
This CL does the following:
1) It adds a SignatureBuf function which uses the OpenSSL library to generate RSA signature. This is more robust than the previous way of invoking the command line "openssl" utility and capturing its output. No more unnecessary temporary files for signature operations.
2) It adds functions that allow direct manipulation of binary verified Firmware and Kernel Image blobs in memory.
3) It changes the structure field members for FirmwareImage to make it consistent with KernelImage. Now it's clearer which key is used when.
4) Minor bug fixes and slightly improved API for dealing verified boot firmware and kernel images.
5) Renames the RSA_verify function to prevent conflicts with OpenSSL since it's linked into the firmware utility binary.
Review URL: http://codereview.chromium.org/661353
diff --git a/utils/firmware_utility.cc b/utils/firmware_utility.cc
index a25be2f..2563fc8 100644
--- a/utils/firmware_utility.cc
+++ b/utils/firmware_utility.cc
@@ -33,8 +33,8 @@
image_(NULL),
root_key_pub_(NULL),
firmware_version_(-1),
- key_version_(-1),
- sign_algorithm_(-1),
+ firmware_key_version_(-1),
+ firmware_sign_algorithm_(-1),
is_generate_(false),
is_verify_(false) {
}
@@ -54,11 +54,11 @@
"to use for verification.\n\n"
"For \"--generate\", required OPTIONS are:\n"
"--root_key <privkeyfile>\tPrivate root key file\n"
- "--sign_key <privkeyfile>\tPrivate signing key file\n"
- "--sign_key_pub <pubkeyfile>\tPre-processed public signing"
+ "--firmware_sign_key <privkeyfile>\tPrivate signing key file\n"
+ "--firmware_sign_key_pub <pubkeyfile>\tPre-processed public signing"
" key\n"
- "--sign_algorithm <algoid>\tSigning algorithm to use\n"
- "--key_version <version#>\tSigning Key Version#\n"
+ "--firmware_sign_algorithm <algoid>\tSigning algorithm to use\n"
+ "--firmware_key_version <version#>\tSigning Key Version#\n"
"--firmware_version <version#>\tFirmware Version#\n"
"--in <infile>\t\t\tFirmware Image to sign\n"
"--out <outfile>\t\t\tOutput file for verified boot firmware image\n\n"
@@ -74,10 +74,10 @@
static struct option long_options[] = {
{"root_key", 1, 0, 0},
{"root_key_pub", 1, 0, 0},
- {"sign_key", 1, 0, 0},
- {"sign_key_pub", 1, 0, 0},
- {"sign_algorithm", 1, 0, 0},
- {"key_version", 1, 0, 0},
+ {"firmware_sign_key", 1, 0, 0},
+ {"firmware_sign_key_pub", 1, 0, 0},
+ {"firmware_sign_algorithm", 1, 0, 0},
+ {"firmware_key_version", 1, 0, 0},
{"firmware_version", 1, 0, 0},
{"in", 1, 0, 0},
{"out", 1, 0, 0},
@@ -100,21 +100,21 @@
case 1: // root_key_pub
root_key_pub_file_ = optarg;
break;
- case 2: // sign_key
- sign_key_file_ = optarg;
+ case 2: // firmware_sign_key
+ firmware_sign_key_file_ = optarg;
break;
- case 3: // sign_key_pub
- sign_key_pub_file_ = optarg;
+ case 3: // firmware_sign_key_pub
+ firmware_sign_key_pub_file_ = optarg;
break;
- case 4: // sign_algorithm
+ case 4: // firmware_sign_algorithm
errno = 0; // strtol() returns an error via errno
- sign_algorithm_ = strtol(optarg, (char**) NULL, 10);
+ firmware_sign_algorithm_ = strtol(optarg, (char**) NULL, 10);
if (errno)
return false;
break;
- case 5: // key_version
+ case 5: // firmware_key_version
errno = 0;
- key_version_ = strtol(optarg, (char**) NULL, 10);
+ firmware_key_version_ = strtol(optarg, (char**) NULL, 10);
if (errno)
return false;
break;
@@ -153,7 +153,7 @@
}
bool FirmwareUtility::GenerateSignedImage(void) {
- uint32_t sign_key_pub_len;
+ uint32_t firmware_sign_key_pub_len;
uint8_t* header_checksum;
DigestContext ctx;
image_ = FirmwareImageNew();
@@ -161,30 +161,31 @@
Memcpy(image_->magic, FIRMWARE_MAGIC, FIRMWARE_MAGIC_SIZE);
// Copy pre-processed public signing key.
- image_->sign_algorithm = (uint16_t) sign_algorithm_;
- image_->sign_key = BufferFromFile(sign_key_pub_file_.c_str(),
- &sign_key_pub_len);
- if (!image_->sign_key)
+ image_->firmware_sign_algorithm = (uint16_t) firmware_sign_algorithm_;
+ image_->firmware_sign_key = BufferFromFile(
+ firmware_sign_key_pub_file_.c_str(),
+ &firmware_sign_key_pub_len);
+ if (!image_->firmware_sign_key)
return false;
- image_->key_version = key_version_;
+ image_->firmware_key_version = firmware_key_version_;
// Update header length.
image_->header_len = (sizeof(image_->header_len) +
- sizeof(image_->sign_algorithm) +
- sign_key_pub_len +
- sizeof(image_->key_version) +
+ sizeof(image_->firmware_sign_algorithm) +
+ firmware_sign_key_pub_len +
+ sizeof(image_->firmware_key_version) +
sizeof(image_->header_checksum));
// Calculate header checksum.
DigestInit(&ctx, SHA512_DIGEST_ALGORITHM);
DigestUpdate(&ctx, (uint8_t*) &image_->header_len,
sizeof(image_->header_len));
- DigestUpdate(&ctx, (uint8_t*) &image_->sign_algorithm,
- sizeof(image_->sign_algorithm));
- DigestUpdate(&ctx, image_->sign_key,
- RSAProcessedKeySize(image_->sign_algorithm));
- DigestUpdate(&ctx, (uint8_t*) &image_->key_version,
- sizeof(image_->key_version));
+ DigestUpdate(&ctx, (uint8_t*) &image_->firmware_sign_algorithm,
+ sizeof(image_->firmware_sign_algorithm));
+ DigestUpdate(&ctx, image_->firmware_sign_key,
+ RSAProcessedKeySize(image_->firmware_sign_algorithm));
+ DigestUpdate(&ctx, (uint8_t*) &image_->firmware_key_version,
+ sizeof(image_->firmware_key_version));
header_checksum = DigestFinal(&ctx);
Memcpy(image_->header_checksum, header_checksum, SHA512_DIGEST_SIZE);
Free(header_checksum);
@@ -199,13 +200,12 @@
if (!image_)
return false;
// Generate and add the signatures.
- if(!AddFirmwareKeySignature(image_, root_key_file_.c_str())) {
+ if (!AddFirmwareKeySignature(image_, root_key_file_.c_str())) {
cerr << "Couldn't write key signature to verified boot image.\n";
return false;
}
- if(!AddFirmwareSignature(image_, sign_key_file_.c_str(),
- image_->sign_algorithm)) {
+ if (!AddFirmwareSignature(image_, firmware_sign_key_file_.c_str())) {
cerr << "Couldn't write firmware signature to verified boot image.\n";
return false;
}
@@ -257,19 +257,20 @@
cerr << "Invalid or no firmware version specified." << "\n";
return false;
}
- if (sign_key_file_.empty()) {
+ if (firmware_sign_key_file_.empty()) {
cerr << "No signing key file specified." << "\n";
return false;
}
- if (sign_key_pub_file_.empty()) {
+ if (firmware_sign_key_pub_file_.empty()) {
cerr << "No pre-processed public signing key file specified." << "\n";
return false;
}
- if (key_version_ <= 0 || key_version_ > UINT16_MAX) {
+ if (firmware_key_version_ <= 0 || firmware_key_version_ > UINT16_MAX) {
cerr << "Invalid or no key version specified." << "\n";
return false;
}
- if (sign_algorithm_ < 0 || sign_algorithm_ >= kNumAlgorithms) {
+ if (firmware_sign_algorithm_ < 0 ||
+ firmware_sign_algorithm_ >= kNumAlgorithms) {
cerr << "Invalid or no signing key algorithm specified." << "\n";
return false;
}