| Index: src/platform/vboot_reference/utils/firmware_utility.cc
|
| diff --git a/src/platform/vboot_reference/utils/firmware_utility.cc b/src/platform/vboot_reference/utils/firmware_utility.cc
|
| index e61b21696000f472e02c107c8c666b7947b5752c..f5a4de8ee8089920a1f20413a8f6468daf7517ed 100644
|
| --- a/src/platform/vboot_reference/utils/firmware_utility.cc
|
| +++ b/src/platform/vboot_reference/utils/firmware_utility.cc
|
| @@ -37,7 +37,8 @@ FirmwareUtility::FirmwareUtility():
|
| firmware_key_version_(-1),
|
| firmware_sign_algorithm_(-1),
|
| is_generate_(false),
|
| - is_verify_(false) {
|
| + is_verify_(false),
|
| + is_describe_(false) {
|
| }
|
|
|
| FirmwareUtility::~FirmwareUtility() {
|
| @@ -84,6 +85,7 @@ bool FirmwareUtility::ParseCmdLineOptions(int argc, char* argv[]) {
|
| {"out", 1, 0, 0},
|
| {"generate", 0, 0, 0},
|
| {"verify", 0, 0, 0},
|
| + {"describe", 0, 0, 0},
|
| {NULL, 0, 0, 0}
|
| };
|
| while (1) {
|
| @@ -137,9 +139,12 @@ bool FirmwareUtility::ParseCmdLineOptions(int argc, char* argv[]) {
|
| case 9: // generate
|
| is_generate_ = true;
|
| break;
|
| - case 10: // verify
|
| + case 10: // verify
|
| is_verify_ = true;
|
| break;
|
| + case 11: // describe
|
| + is_describe_ = true;
|
| + break;
|
| }
|
| }
|
| }
|
| @@ -156,10 +161,16 @@ void FirmwareUtility::OutputSignedImage(void) {
|
| }
|
| }
|
|
|
| +void FirmwareUtility::DescribeSignedImage(void) {
|
| + image_ = ReadFirmwareImage(in_file_.c_str());
|
| + if (!image_) {
|
| + cerr << "Couldn't read firmware image or malformed image.\n";
|
| + }
|
| + PrintFirmwareImage(image_);
|
| +}
|
| +
|
| bool FirmwareUtility::GenerateSignedImage(void) {
|
| uint64_t firmware_sign_key_pub_len;
|
| - uint8_t* header_checksum;
|
| - DigestContext ctx;
|
| image_ = FirmwareImageNew();
|
|
|
| Memcpy(image_->magic, FIRMWARE_MAGIC, FIRMWARE_MAGIC_SIZE);
|
| @@ -177,19 +188,7 @@ bool FirmwareUtility::GenerateSignedImage(void) {
|
| image_->header_len = GetFirmwareHeaderLen(image_);
|
|
|
| // Calculate header checksum.
|
| - DigestInit(&ctx, SHA512_DIGEST_ALGORITHM);
|
| - DigestUpdate(&ctx, reinterpret_cast<uint8_t*>(&image_->header_len),
|
| - sizeof(image_->header_len));
|
| - DigestUpdate(&ctx,
|
| - reinterpret_cast<uint8_t*>(&image_->firmware_sign_algorithm),
|
| - sizeof(image_->firmware_sign_algorithm));
|
| - DigestUpdate(&ctx, image_->firmware_sign_key,
|
| - RSAProcessedKeySize(image_->firmware_sign_algorithm));
|
| - DigestUpdate(&ctx, reinterpret_cast<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);
|
| + CalculateFirmwareHeaderChecksum(image_, image_->header_checksum);
|
|
|
| image_->firmware_version = firmware_version_;
|
| image_->firmware_len = 0;
|
| @@ -235,8 +234,12 @@ bool FirmwareUtility::VerifySignedImage(void) {
|
| }
|
|
|
| bool FirmwareUtility::CheckOptions(void) {
|
| - if (is_generate_ == is_verify_) {
|
| - cerr << "One of --generate or --verify must be specified.\n";
|
| + // Ensure that only one of --{describe|generate|verify} is set.
|
| + if (!((is_describe_ && !is_generate_ && !is_verify_) ||
|
| + (!is_describe_ && is_generate_ && !is_verify_) ||
|
| + (!is_describe_ && !is_generate_ && is_verify_))) {
|
| + cerr << "One (and only one) of --describe, --generate or --verify "
|
| + << "must be specified.\n";
|
| return false;
|
| }
|
| // Common required options.
|
| @@ -293,6 +296,9 @@ int main(int argc, char* argv[]) {
|
| fu.PrintUsage();
|
| return -1;
|
| }
|
| + if (fu.is_describe()) {
|
| + fu.DescribeSignedImage();
|
| + }
|
| if (fu.is_generate()) {
|
| if (!fu.GenerateSignedImage())
|
| return -1;
|
|
|