update_engine: Deprecate major version 1
We have moved away from major version 1 in Chrome OS and already have a
stepping stone for it in M53. So this cleanup makes the code much easier
to understand.
BUG=chromium:1008553
TEST=FEATURES="test" sudo emerge update_engine update_payload
TEST=cros_generate_update_payload --image chromiumos_test_image.bin --check --output delta.bin
Change-Id: I01815dfa5fdf395f8214ef162e01ecca2d42f7fc
Reviewed-on: https://chromium-review.googlesource.com/c/aosp/platform/system/update_engine/+/1857459
Tested-by: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Sen Jiang <senj@chromium.org>
Commit-Queue: Amin Hassani <ahassani@chromium.org>
diff --git a/payload_consumer/delta_performer.cc b/payload_consumer/delta_performer.cc
index cc39943..ee5f38c 100644
--- a/payload_consumer/delta_performer.cc
+++ b/payload_consumer/delta_performer.cc
@@ -713,8 +713,7 @@
// In major version 2, we don't add dummy operation to the payload.
// If we already extracted the signature we should skip this step.
- if (major_payload_version_ == kBrilloMajorPayloadVersion &&
- manifest_.has_signatures_offset() && manifest_.has_signatures_size() &&
+ if (manifest_.has_signatures_offset() && manifest_.has_signatures_size() &&
signatures_message_data_.empty()) {
if (manifest_.signatures_offset() != buffer_offset_) {
LOG(ERROR) << "Payload signatures offset points to blob offset "
@@ -749,51 +748,11 @@
}
bool DeltaPerformer::ParseManifestPartitions(ErrorCode* error) {
- if (major_payload_version_ == kBrilloMajorPayloadVersion) {
- partitions_.clear();
- for (const PartitionUpdate& partition : manifest_.partitions()) {
- partitions_.push_back(partition);
- }
- manifest_.clear_partitions();
- } else if (major_payload_version_ == kChromeOSMajorPayloadVersion) {
- LOG(INFO) << "Converting update information from old format.";
- PartitionUpdate root_part;
- root_part.set_partition_name(kPartitionNameRoot);
-#ifdef __ANDROID__
- LOG(WARNING) << "Legacy payload major version provided to an Android "
- "build. Assuming no post-install. Please use major version "
- "2 or newer.";
- root_part.set_run_postinstall(false);
-#else
- root_part.set_run_postinstall(true);
-#endif // __ANDROID__
- if (manifest_.has_old_rootfs_info()) {
- *root_part.mutable_old_partition_info() = manifest_.old_rootfs_info();
- manifest_.clear_old_rootfs_info();
- }
- if (manifest_.has_new_rootfs_info()) {
- *root_part.mutable_new_partition_info() = manifest_.new_rootfs_info();
- manifest_.clear_new_rootfs_info();
- }
- *root_part.mutable_operations() = manifest_.install_operations();
- manifest_.clear_install_operations();
- partitions_.push_back(std::move(root_part));
-
- PartitionUpdate kern_part;
- kern_part.set_partition_name(kPartitionNameKernel);
- kern_part.set_run_postinstall(false);
- if (manifest_.has_old_kernel_info()) {
- *kern_part.mutable_old_partition_info() = manifest_.old_kernel_info();
- manifest_.clear_old_kernel_info();
- }
- if (manifest_.has_new_kernel_info()) {
- *kern_part.mutable_new_partition_info() = manifest_.new_kernel_info();
- manifest_.clear_new_kernel_info();
- }
- *kern_part.mutable_operations() = manifest_.kernel_install_operations();
- manifest_.clear_kernel_install_operations();
- partitions_.push_back(std::move(kern_part));
+ partitions_.clear();
+ for (const PartitionUpdate& partition : manifest_.partitions()) {
+ partitions_.push_back(partition);
}
+ manifest_.clear_partitions();
// Fill in the InstallPlan::partitions based on the partitions from the
// payload.
@@ -954,14 +913,6 @@
TEST_AND_RETURN_FALSE(buffer_offset_ == operation.data_offset());
TEST_AND_RETURN_FALSE(buffer_.size() >= operation.data_length());
- // Extract the signature message if it's in this operation.
- if (ExtractSignatureMessageFromOperation(operation)) {
- // If this is dummy replace operation, we ignore it after extracting the
- // signature.
- DiscardBuffer(true, 0);
- return true;
- }
-
// Setup the ExtentWriter stack based on the operation type.
std::unique_ptr<ExtentWriter> writer = std::make_unique<DirectExtentWriter>();
@@ -1412,19 +1363,6 @@
return true;
}
-bool DeltaPerformer::ExtractSignatureMessageFromOperation(
- const InstallOperation& operation) {
- if (operation.type() != InstallOperation::REPLACE ||
- !manifest_.has_signatures_offset() ||
- manifest_.signatures_offset() != operation.data_offset()) {
- return false;
- }
- TEST_AND_RETURN_FALSE(manifest_.has_signatures_size() &&
- manifest_.signatures_size() == operation.data_length());
- TEST_AND_RETURN_FALSE(ExtractSignatureMessage());
- return true;
-}
-
bool DeltaPerformer::ExtractSignatureMessage() {
TEST_AND_RETURN_FALSE(signatures_message_data_.empty());
TEST_AND_RETURN_FALSE(buffer_offset_ == manifest_.signatures_offset());
@@ -1476,11 +1414,11 @@
// Perform assorted checks to sanity check the manifest, make sure it
// matches data from other sources, and that it is a supported version.
- bool has_old_fields =
- (manifest_.has_old_kernel_info() || manifest_.has_old_rootfs_info());
- for (const PartitionUpdate& partition : manifest_.partitions()) {
- has_old_fields = has_old_fields || partition.has_old_partition_info();
- }
+ bool has_old_fields = std::any_of(manifest_.partitions().begin(),
+ manifest_.partitions().end(),
+ [](const PartitionUpdate& partition) {
+ return partition.has_old_partition_info();
+ });
// The presence of an old partition hash is the sole indicator for a delta
// update.
@@ -1522,16 +1460,12 @@
}
}
- if (major_payload_version_ != kChromeOSMajorPayloadVersion) {
- if (manifest_.has_old_rootfs_info() || manifest_.has_new_rootfs_info() ||
- manifest_.has_old_kernel_info() || manifest_.has_new_kernel_info() ||
- manifest_.install_operations_size() != 0 ||
- manifest_.kernel_install_operations_size() != 0) {
- LOG(ERROR) << "Manifest contains deprecated field only supported in "
- << "major payload version 1, but the payload major version is "
- << major_payload_version_;
- return ErrorCode::kPayloadMismatchedType;
- }
+ if (manifest_.has_old_rootfs_info() || manifest_.has_new_rootfs_info() ||
+ manifest_.has_old_kernel_info() || manifest_.has_new_kernel_info() ||
+ manifest_.install_operations_size() != 0 ||
+ manifest_.kernel_install_operations_size() != 0) {
+ LOG(ERROR) << "Manifest contains deprecated fields.";
+ return ErrorCode::kPayloadMismatchedType;
}
if (manifest_.max_timestamp() < hardware_->GetBuildTimestamp()) {
@@ -1542,18 +1476,8 @@
return ErrorCode::kPayloadTimestampError;
}
- if (major_payload_version_ == kChromeOSMajorPayloadVersion) {
- if (manifest_.has_dynamic_partition_metadata()) {
- LOG(ERROR)
- << "Should not contain dynamic_partition_metadata for major version "
- << kChromeOSMajorPayloadVersion
- << ". Please use major version 2 or above.";
- return ErrorCode::kPayloadMismatchedType;
- }
- }
-
- // TODO(garnold) we should be adding more and more manifest checks, such as
- // partition boundaries etc (see chromium-os:37661).
+ // TODO(crbug.com/37661) we should be adding more and more manifest checks,
+ // such as partition boundaries, etc.
return ErrorCode::kSuccess;
}
diff --git a/payload_consumer/delta_performer.h b/payload_consumer/delta_performer.h
index 4493c2a..7860747 100644
--- a/payload_consumer/delta_performer.h
+++ b/payload_consumer/delta_performer.h
@@ -237,11 +237,6 @@
FileDescriptorPtr ChooseSourceFD(const InstallOperation& operation,
ErrorCode* error);
- // Extracts the payload signature message from the blob on the |operation| if
- // the offset matches the one specified by the manifest. Returns whether the
- // signature was extracted.
- bool ExtractSignatureMessageFromOperation(const InstallOperation& operation);
-
// Extracts the payload signature message from the current |buffer_| if the
// offset matches the one specified by the manifest. Returns whether the
// signature was extracted.
diff --git a/payload_consumer/delta_performer_integration_test.cc b/payload_consumer/delta_performer_integration_test.cc
index 904ea5a..5f55739 100644
--- a/payload_consumer/delta_performer_integration_test.cc
+++ b/payload_consumer/delta_performer_integration_test.cc
@@ -76,6 +76,7 @@
string delta_path;
uint64_t metadata_size;
+ uint32_t metadata_signature_size;
string old_kernel;
brillo::Blob old_kernel_data;
@@ -187,17 +188,32 @@
uint64_t* out_metadata_size) {
string private_key_path = GetBuildArtifactsPath(kUnittestPrivateKeyPath);
int signature_size = GetSignatureSize(private_key_path);
- brillo::Blob hash;
+ brillo::Blob metadata_hash, payload_hash;
ASSERT_TRUE(PayloadSigner::HashPayloadForSigning(
- payload_path, {signature_size}, &hash, nullptr));
- brillo::Blob signature;
- ASSERT_TRUE(PayloadSigner::SignHash(hash, private_key_path, &signature));
- ASSERT_TRUE(PayloadSigner::AddSignatureToPayload(
- payload_path, {signature}, {}, payload_path, out_metadata_size));
+ payload_path, {signature_size}, &payload_hash, &metadata_hash));
+ brillo::Blob metadata_signature, payload_signature;
+ ASSERT_TRUE(PayloadSigner::SignHash(
+ payload_hash, private_key_path, &payload_signature));
+ ASSERT_TRUE(PayloadSigner::SignHash(
+ metadata_hash, private_key_path, &metadata_signature));
+ ASSERT_TRUE(PayloadSigner::AddSignatureToPayload(payload_path,
+ {payload_signature},
+ {metadata_signature},
+ payload_path,
+ out_metadata_size));
EXPECT_TRUE(PayloadSigner::VerifySignedPayload(
payload_path, GetBuildArtifactsPath(kUnittestPublicKeyPath)));
}
+static void SignHashToFile(const string& hash_file,
+ const string& signature_file,
+ const string& private_key_file) {
+ brillo::Blob hash, signature;
+ ASSERT_TRUE(utils::ReadFile(hash_file, &hash));
+ ASSERT_TRUE(PayloadSigner::SignHash(hash, private_key_file, &signature));
+ ASSERT_TRUE(test_utils::WriteFileVector(signature_file, signature));
+}
+
static void SignGeneratedShellPayload(SignatureTest signature_test,
const string& payload_path) {
string private_key_path = GetBuildArtifactsPath(kUnittestPrivateKeyPath);
@@ -230,7 +246,8 @@
RSA_free(rsa);
}
int signature_size = GetSignatureSize(private_key_path);
- test_utils::ScopedTempFile hash_file("hash.XXXXXX");
+ test_utils::ScopedTempFile payload_hash_file("hash.XXXXXX"),
+ metadata_hash_file("hash.XXXXXX");
string signature_size_string;
if (signature_test == kSignatureGeneratedShellRotateCl1 ||
signature_test == kSignatureGeneratedShellRotateCl2)
@@ -241,38 +258,51 @@
string delta_generator_path = GetBuildArtifactsPath("delta_generator");
ASSERT_EQ(0,
System(base::StringPrintf(
- "%s -in_file=%s -signature_size=%s -out_hash_file=%s",
+ "%s -in_file=%s -signature_size=%s -out_hash_file=%s "
+ "-out_metadata_hash_file=%s",
delta_generator_path.c_str(),
payload_path.c_str(),
signature_size_string.c_str(),
- hash_file.path().c_str())));
+ payload_hash_file.path().c_str(),
+ metadata_hash_file.path().c_str())));
- // Sign the hash
- brillo::Blob hash, signature;
- ASSERT_TRUE(utils::ReadFile(hash_file.path(), &hash));
- ASSERT_TRUE(PayloadSigner::SignHash(hash, private_key_path, &signature));
+ // Sign the payload hash.
+ test_utils::ScopedTempFile payload_signature_file("signature.XXXXXX");
+ SignHashToFile(payload_hash_file.path(),
+ payload_signature_file.path(),
+ private_key_path);
+ string payload_sig_files = payload_signature_file.path();
+ // Sign the metadata hash.
+ test_utils::ScopedTempFile metadata_signature_file("signature.XXXXXX");
+ SignHashToFile(metadata_hash_file.path(),
+ metadata_signature_file.path(),
+ private_key_path);
+ string metadata_sig_files = metadata_signature_file.path();
- test_utils::ScopedTempFile sig_file("signature.XXXXXX");
- ASSERT_TRUE(test_utils::WriteFileVector(sig_file.path(), signature));
- string sig_files = sig_file.path();
-
- test_utils::ScopedTempFile sig_file2("signature.XXXXXX");
+ test_utils::ScopedTempFile payload_signature_file2("signature.XXXXXX");
+ test_utils::ScopedTempFile metadata_signature_file2("signature.XXXXXX");
if (signature_test == kSignatureGeneratedShellRotateCl1 ||
signature_test == kSignatureGeneratedShellRotateCl2) {
- ASSERT_TRUE(PayloadSigner::SignHash(
- hash, GetBuildArtifactsPath(kUnittestPrivateKey2Path), &signature));
- ASSERT_TRUE(test_utils::WriteFileVector(sig_file2.path(), signature));
+ SignHashToFile(payload_hash_file.path(),
+ payload_signature_file2.path(),
+ GetBuildArtifactsPath(kUnittestPrivateKey2Path));
+ SignHashToFile(metadata_hash_file.path(),
+ metadata_signature_file2.path(),
+ GetBuildArtifactsPath(kUnittestPrivateKey2Path));
// Append second sig file to first path
- sig_files += ":" + sig_file2.path();
+ payload_sig_files += ":" + payload_signature_file2.path();
+ metadata_sig_files += ":" + metadata_signature_file2.path();
}
- ASSERT_EQ(0,
- System(base::StringPrintf(
- "%s -in_file=%s -payload_signature_file=%s -out_file=%s",
- delta_generator_path.c_str(),
- payload_path.c_str(),
- sig_files.c_str(),
- payload_path.c_str())));
+ ASSERT_EQ(
+ 0,
+ System(base::StringPrintf("%s -in_file=%s -payload_signature_file=%s "
+ "-metadata_signature_file=%s -out_file=%s",
+ delta_generator_path.c_str(),
+ payload_path.c_str(),
+ payload_sig_files.c_str(),
+ metadata_sig_files.c_str(),
+ payload_path.c_str())));
int verify_result = System(base::StringPrintf(
"%s -in_file=%s -public_key=%s -public_key_version=%d",
delta_generator_path.c_str(),
@@ -474,7 +504,7 @@
payload_config.is_delta = !full_rootfs;
payload_config.hard_chunk_size = chunk_size;
payload_config.rootfs_partition_size = kRootFSPartitionSize;
- payload_config.version.major = kChromeOSMajorPayloadVersion;
+ payload_config.version.major = kBrilloMajorPayloadVersion;
payload_config.version.minor = minor_version;
if (!full_rootfs) {
payload_config.source.partitions.emplace_back(kPartitionNameRoot);
@@ -564,6 +594,9 @@
EXPECT_TRUE(payload_metadata.ParsePayloadHeader(state->delta));
state->metadata_size = payload_metadata.GetMetadataSize();
LOG(INFO) << "Metadata size: " << state->metadata_size;
+ state->metadata_signature_size =
+ payload_metadata.GetMetadataSignatureSize();
+ LOG(INFO) << "Metadata signature size: " << state->metadata_signature_size;
DeltaArchiveManifest manifest;
EXPECT_TRUE(payload_metadata.GetManifest(state->delta, &manifest));
@@ -575,7 +608,8 @@
EXPECT_TRUE(manifest.has_signatures_size());
Signatures sigs_message;
EXPECT_TRUE(sigs_message.ParseFromArray(
- &state->delta[state->metadata_size + manifest.signatures_offset()],
+ &state->delta[state->metadata_size + state->metadata_signature_size +
+ manifest.signatures_offset()],
manifest.signatures_size()));
if (signature_test == kSignatureGeneratedShellRotateCl1 ||
signature_test == kSignatureGeneratedShellRotateCl2)
@@ -597,13 +631,38 @@
EXPECT_FALSE(signature.data().empty());
}
+ // TODO(ahassani): Make |DeltaState| into a partition list kind of struct
+ // instead of hardcoded kernel/rootfs so its cleaner and we can make the
+ // following code into a helper function instead.
+ const auto& kernel_part = *std::find_if(
+ manifest.partitions().begin(),
+ manifest.partitions().end(),
+ [](const PartitionUpdate& partition) {
+ return partition.partition_name() == kPartitionNameKernel;
+ });
if (full_kernel) {
- EXPECT_FALSE(manifest.has_old_kernel_info());
+ EXPECT_FALSE(kernel_part.has_old_partition_info());
} else {
EXPECT_EQ(state->old_kernel_data.size(),
- manifest.old_kernel_info().size());
- EXPECT_FALSE(manifest.old_kernel_info().hash().empty());
+ kernel_part.old_partition_info().size());
+ EXPECT_FALSE(kernel_part.old_partition_info().hash().empty());
}
+ EXPECT_EQ(state->new_kernel_data.size(),
+ kernel_part.new_partition_info().size());
+ EXPECT_FALSE(kernel_part.new_partition_info().hash().empty());
+
+ const auto& rootfs_part =
+ *std::find_if(manifest.partitions().begin(),
+ manifest.partitions().end(),
+ [](const PartitionUpdate& partition) {
+ return partition.partition_name() == kPartitionNameRoot;
+ });
+ if (full_rootfs) {
+ EXPECT_FALSE(rootfs_part.has_old_partition_info());
+ } else {
+ EXPECT_FALSE(rootfs_part.old_partition_info().hash().empty());
+ }
+ EXPECT_FALSE(rootfs_part.new_partition_info().hash().empty());
EXPECT_EQ(manifest.new_image_info().channel(), "test-channel");
EXPECT_EQ(manifest.new_image_info().board(), "test-board");
@@ -620,27 +679,14 @@
EXPECT_EQ(manifest.old_image_info().build_channel(), "src-build-channel");
EXPECT_EQ(manifest.old_image_info().build_version(), "src-build-version");
}
-
- if (full_rootfs) {
- EXPECT_FALSE(manifest.has_old_rootfs_info());
- EXPECT_FALSE(manifest.has_old_image_info());
- EXPECT_TRUE(manifest.has_new_image_info());
- } else {
- EXPECT_EQ(state->image_size, manifest.old_rootfs_info().size());
- EXPECT_FALSE(manifest.old_rootfs_info().hash().empty());
- }
-
- EXPECT_EQ(state->new_kernel_data.size(), manifest.new_kernel_info().size());
- EXPECT_EQ(state->image_size, manifest.new_rootfs_info().size());
-
- EXPECT_FALSE(manifest.new_kernel_info().hash().empty());
- EXPECT_FALSE(manifest.new_rootfs_info().hash().empty());
}
MockPrefs prefs;
EXPECT_CALL(prefs, SetInt64(kPrefsManifestMetadataSize, state->metadata_size))
.WillOnce(Return(true));
- EXPECT_CALL(prefs, SetInt64(kPrefsManifestSignatureSize, 0))
+ EXPECT_CALL(
+ prefs,
+ SetInt64(kPrefsManifestSignatureSize, state->metadata_signature_size))
.WillOnce(Return(true));
EXPECT_CALL(prefs, SetInt64(kPrefsUpdateStateNextOperation, _))
.WillRepeatedly(Return(true));
diff --git a/payload_consumer/delta_performer_unittest.cc b/payload_consumer/delta_performer_unittest.cc
index 61b58ed..0671eca 100644
--- a/payload_consumer/delta_performer_unittest.cc
+++ b/payload_consumer/delta_performer_unittest.cc
@@ -304,14 +304,16 @@
// Set a valid magic string and version number 1.
EXPECT_TRUE(performer_.Write("CrAU", 4));
- uint64_t version = htobe64(kChromeOSMajorPayloadVersion);
+ uint64_t version = htobe64(kBrilloMajorPayloadVersion);
EXPECT_TRUE(performer_.Write(&version, 8));
payload_.metadata_size = expected_metadata_size;
ErrorCode error_code;
- // When filling in size in manifest, exclude the size of the 20-byte header.
- uint64_t size_in_manifest = htobe64(actual_metadata_size - 20);
- bool result = performer_.Write(&size_in_manifest, 8, &error_code);
+ // When filling in size in manifest, exclude the size of the 24-byte header.
+ uint64_t size_in_manifest = htobe64(actual_metadata_size - 24);
+ performer_.Write(&size_in_manifest, 8, &error_code);
+ uint32_t signature_size = htobe64(10);
+ bool result = performer_.Write(&signature_size, 4, &error_code);
if (expected_metadata_size == actual_metadata_size ||
!hash_checks_mandatory) {
EXPECT_TRUE(result);
@@ -333,7 +335,7 @@
brillo::Blob payload = GeneratePayload(brillo::Blob(),
vector<AnnotatedOperation>(),
sign_payload,
- kChromeOSMajorPayloadVersion,
+ kBrilloMajorPayloadVersion,
kFullPayloadMinorVersion);
LOG(INFO) << "Payload size: " << payload.size();
@@ -347,6 +349,9 @@
switch (metadata_signature_test) {
case kEmptyMetadataSignature:
payload_.metadata_signature.clear();
+ // We need to set the signature size in a signed payload to zero.
+ std::fill(
+ std::next(payload.begin(), 20), std::next(payload.begin(), 24), 0);
expected_result = MetadataParseResult::kError;
expected_error = ErrorCode::kDownloadMetadataSignatureMissingError;
break;
@@ -447,7 +452,7 @@
brillo::Blob payload_data = GeneratePayload(expected_data,
aops,
false,
- kChromeOSMajorPayloadVersion,
+ kBrilloMajorPayloadVersion,
kFullPayloadMinorVersion);
EXPECT_EQ(expected_data, ApplyPayload(payload_data, "/dev/null", true));
@@ -469,7 +474,7 @@
brillo::Blob payload_data = GeneratePayload(expected_data,
aops,
false,
- kChromeOSMajorPayloadVersion,
+ kBrilloMajorPayloadVersion,
kFullPayloadMinorVersion);
testing::Mock::VerifyAndClearExpectations(&mock_delegate_);
@@ -725,27 +730,32 @@
TEST_F(DeltaPerformerTest, ValidateManifestFullGoodTest) {
// The Manifest we are validating.
DeltaArchiveManifest manifest;
- manifest.mutable_new_kernel_info();
- manifest.mutable_new_rootfs_info();
+ for (const auto& part_name : {"kernel", "rootfs"}) {
+ auto part = manifest.add_partitions();
+ part->set_partition_name(part_name);
+ part->mutable_new_partition_info();
+ }
manifest.set_minor_version(kFullPayloadMinorVersion);
RunManifestValidation(manifest,
- kChromeOSMajorPayloadVersion,
+ kBrilloMajorPayloadVersion,
InstallPayloadType::kFull,
ErrorCode::kSuccess);
}
-TEST_F(DeltaPerformerTest, ValidateManifestDeltaGoodTest) {
+TEST_F(DeltaPerformerTest, ValidateManifestDeltaMaxGoodTest) {
// The Manifest we are validating.
DeltaArchiveManifest manifest;
- manifest.mutable_old_kernel_info();
- manifest.mutable_old_rootfs_info();
- manifest.mutable_new_kernel_info();
- manifest.mutable_new_rootfs_info();
+ for (const auto& part_name : {"kernel", "rootfs"}) {
+ auto part = manifest.add_partitions();
+ part->set_partition_name(part_name);
+ part->mutable_old_partition_info();
+ part->mutable_new_partition_info();
+ }
manifest.set_minor_version(kMaxSupportedMinorPayloadVersion);
RunManifestValidation(manifest,
- kChromeOSMajorPayloadVersion,
+ kBrilloMajorPayloadVersion,
InstallPayloadType::kDelta,
ErrorCode::kSuccess);
}
@@ -753,14 +763,16 @@
TEST_F(DeltaPerformerTest, ValidateManifestDeltaMinGoodTest) {
// The Manifest we are validating.
DeltaArchiveManifest manifest;
- manifest.mutable_old_kernel_info();
- manifest.mutable_old_rootfs_info();
- manifest.mutable_new_kernel_info();
- manifest.mutable_new_rootfs_info();
+ for (const auto& part_name : {"kernel", "rootfs"}) {
+ auto part = manifest.add_partitions();
+ part->set_partition_name(part_name);
+ part->mutable_old_partition_info();
+ part->mutable_new_partition_info();
+ }
manifest.set_minor_version(kMinSupportedMinorPayloadVersion);
RunManifestValidation(manifest,
- kChromeOSMajorPayloadVersion,
+ kBrilloMajorPayloadVersion,
InstallPayloadType::kDelta,
ErrorCode::kSuccess);
}
@@ -778,9 +790,11 @@
TEST_F(DeltaPerformerTest, ValidateManifestDeltaUnsetMinorVersion) {
// The Manifest we are validating.
DeltaArchiveManifest manifest;
- // Add an empty old_rootfs_info() to trick the DeltaPerformer into think that
- // this is a delta payload manifest with a missing minor version.
- manifest.mutable_old_rootfs_info();
+ // Add an empty rootfs partition info to trick the DeltaPerformer into think
+ // that this is a delta payload manifest with a missing minor version.
+ auto rootfs = manifest.add_partitions();
+ rootfs->set_partition_name("rootfs");
+ rootfs->mutable_old_partition_info();
RunManifestValidation(manifest,
kMaxSupportedMajorPayloadVersion,
@@ -791,27 +805,15 @@
TEST_F(DeltaPerformerTest, ValidateManifestFullOldKernelTest) {
// The Manifest we are validating.
DeltaArchiveManifest manifest;
- manifest.mutable_old_kernel_info();
- manifest.mutable_new_kernel_info();
- manifest.mutable_new_rootfs_info();
- manifest.set_minor_version(kMaxSupportedMinorPayloadVersion);
-
+ for (const auto& part_name : {"kernel", "rootfs"}) {
+ auto part = manifest.add_partitions();
+ part->set_partition_name(part_name);
+ part->mutable_old_partition_info();
+ part->mutable_new_partition_info();
+ }
+ manifest.mutable_partitions(0)->clear_old_partition_info();
RunManifestValidation(manifest,
- kChromeOSMajorPayloadVersion,
- InstallPayloadType::kFull,
- ErrorCode::kPayloadMismatchedType);
-}
-
-TEST_F(DeltaPerformerTest, ValidateManifestFullOldRootfsTest) {
- // The Manifest we are validating.
- DeltaArchiveManifest manifest;
- manifest.mutable_old_rootfs_info();
- manifest.mutable_new_kernel_info();
- manifest.mutable_new_rootfs_info();
- manifest.set_minor_version(kMaxSupportedMinorPayloadVersion);
-
- RunManifestValidation(manifest,
- kChromeOSMajorPayloadVersion,
+ kBrilloMajorPayloadVersion,
InstallPayloadType::kFull,
ErrorCode::kPayloadMismatchedType);
}
@@ -836,8 +838,8 @@
// Generate a bad version number.
manifest.set_minor_version(kMaxSupportedMinorPayloadVersion + 10000);
- // Mark the manifest as a delta payload by setting old_rootfs_info.
- manifest.mutable_old_rootfs_info();
+ // Mark the manifest as a delta payload by setting |old_partition_info|.
+ manifest.add_partitions()->mutable_old_partition_info();
RunManifestValidation(manifest,
kMaxSupportedMajorPayloadVersion,
diff --git a/payload_consumer/payload_constants.cc b/payload_consumer/payload_constants.cc
index 9e684d7..908a893 100644
--- a/payload_consumer/payload_constants.cc
+++ b/payload_consumer/payload_constants.cc
@@ -20,9 +20,12 @@
namespace chromeos_update_engine {
-const uint64_t kChromeOSMajorPayloadVersion = 1;
+// const uint64_t kChromeOSMajorPayloadVersion = 1; DEPRECATED
const uint64_t kBrilloMajorPayloadVersion = 2;
+const uint64_t kMinSupportedMajorPayloadVersion = kBrilloMajorPayloadVersion;
+const uint64_t kMaxSupportedMajorPayloadVersion = kBrilloMajorPayloadVersion;
+
const uint32_t kFullPayloadMinorVersion = 0;
// const uint32_t kInPlaceMinorPayloadVersion = 1; DEPRECATED
const uint32_t kSourceMinorPayloadVersion = 2;
@@ -34,9 +37,6 @@
const uint32_t kMinSupportedMinorPayloadVersion = kSourceMinorPayloadVersion;
const uint32_t kMaxSupportedMinorPayloadVersion = kVerityMinorPayloadVersion;
-const uint64_t kMinSupportedMajorPayloadVersion = 1;
-const uint64_t kMaxSupportedMajorPayloadVersion = 2;
-
const uint64_t kMaxPayloadHeaderSize = 24;
const char kPartitionNameKernel[] = "kernel";
diff --git a/payload_consumer/payload_constants.h b/payload_consumer/payload_constants.h
index fe823f4..888fa2a 100644
--- a/payload_consumer/payload_constants.h
+++ b/payload_consumer/payload_constants.h
@@ -26,7 +26,7 @@
namespace chromeos_update_engine {
// The major version used by Chrome OS.
-extern const uint64_t kChromeOSMajorPayloadVersion;
+// extern const uint64_t kChromeOSMajorPayloadVersion; DEPRECATED
// The major version used by Brillo.
extern const uint64_t kBrilloMajorPayloadVersion;
diff --git a/payload_consumer/payload_metadata.cc b/payload_consumer/payload_metadata.cc
index 337edb4..4d8ee7b 100644
--- a/payload_consumer/payload_metadata.cc
+++ b/payload_consumer/payload_metadata.cc
@@ -36,34 +36,18 @@
const uint64_t PayloadMetadata::kDeltaManifestSizeSize = 8;
const uint64_t PayloadMetadata::kDeltaMetadataSignatureSizeSize = 4;
-bool PayloadMetadata::GetMetadataSignatureSizeOffset(
- uint64_t* out_offset) const {
- if (GetMajorVersion() == kBrilloMajorPayloadVersion) {
- *out_offset = kDeltaManifestSizeOffset + kDeltaManifestSizeSize;
- return true;
- }
- return false;
+uint64_t PayloadMetadata::GetMetadataSignatureSizeOffset() const {
+ return kDeltaManifestSizeOffset + kDeltaManifestSizeSize;
}
-bool PayloadMetadata::GetManifestOffset(uint64_t* out_offset) const {
- // Actual manifest begins right after the manifest size field or
- // metadata signature size field if major version >= 2.
- if (major_payload_version_ == kChromeOSMajorPayloadVersion) {
- *out_offset = kDeltaManifestSizeOffset + kDeltaManifestSizeSize;
- return true;
- }
- if (major_payload_version_ == kBrilloMajorPayloadVersion) {
- *out_offset = kDeltaManifestSizeOffset + kDeltaManifestSizeSize +
- kDeltaMetadataSignatureSizeSize;
- return true;
- }
- LOG(ERROR) << "Unknown major payload version: " << major_payload_version_;
- return false;
+uint64_t PayloadMetadata::GetManifestOffset() const {
+ // Actual manifest begins right after the metadata signature size field.
+ return kDeltaManifestSizeOffset + kDeltaManifestSizeSize +
+ kDeltaMetadataSignatureSizeSize;
}
MetadataParseResult PayloadMetadata::ParsePayloadHeader(
const brillo::Blob& payload, ErrorCode* error) {
- uint64_t manifest_offset;
// Ensure we have data to cover the major payload version.
if (payload.size() < kDeltaManifestSizeOffset)
return MetadataParseResult::kInsufficientData;
@@ -75,6 +59,11 @@
return MetadataParseResult::kError;
}
+ uint64_t manifest_offset = GetManifestOffset();
+ // Check again with the manifest offset.
+ if (payload.size() < manifest_offset)
+ return MetadataParseResult::kInsufficientData;
+
// Extract the payload version from the metadata.
static_assert(sizeof(major_payload_version_) == kDeltaVersionSize,
"Major payload version size mismatch");
@@ -92,15 +81,6 @@
return MetadataParseResult::kError;
}
- // Get the manifest offset now that we have payload version.
- if (!GetManifestOffset(&manifest_offset)) {
- *error = ErrorCode::kUnsupportedMajorPayloadVersion;
- return MetadataParseResult::kError;
- }
- // Check again with the manifest offset.
- if (payload.size() < manifest_offset)
- return MetadataParseResult::kInsufficientData;
-
// Next, parse the manifest size.
static_assert(sizeof(manifest_size_) == kDeltaManifestSizeSize,
"manifest_size size mismatch");
@@ -116,26 +96,20 @@
return MetadataParseResult::kError;
}
- if (GetMajorVersion() == kBrilloMajorPayloadVersion) {
- // Parse the metadata signature size.
- static_assert(
- sizeof(metadata_signature_size_) == kDeltaMetadataSignatureSizeSize,
- "metadata_signature_size size mismatch");
- uint64_t metadata_signature_size_offset;
- if (!GetMetadataSignatureSizeOffset(&metadata_signature_size_offset)) {
- *error = ErrorCode::kError;
- return MetadataParseResult::kError;
- }
- memcpy(&metadata_signature_size_,
- &payload[metadata_signature_size_offset],
- kDeltaMetadataSignatureSizeSize);
- metadata_signature_size_ = be32toh(metadata_signature_size_);
+ // Parse the metadata signature size.
+ static_assert(
+ sizeof(metadata_signature_size_) == kDeltaMetadataSignatureSizeSize,
+ "metadata_signature_size size mismatch");
+ uint64_t metadata_signature_size_offset = GetMetadataSignatureSizeOffset();
+ memcpy(&metadata_signature_size_,
+ &payload[metadata_signature_size_offset],
+ kDeltaMetadataSignatureSizeSize);
+ metadata_signature_size_ = be32toh(metadata_signature_size_);
- if (metadata_size_ + metadata_signature_size_ < metadata_size_) {
- // Overflow detected.
- *error = ErrorCode::kDownloadInvalidMetadataSize;
- return MetadataParseResult::kError;
- }
+ if (metadata_size_ + metadata_signature_size_ < metadata_size_) {
+ // Overflow detected.
+ *error = ErrorCode::kDownloadInvalidMetadataSize;
+ return MetadataParseResult::kError;
}
return MetadataParseResult::kSuccess;
}
@@ -147,9 +121,7 @@
bool PayloadMetadata::GetManifest(const brillo::Blob& payload,
DeltaArchiveManifest* out_manifest) const {
- uint64_t manifest_offset;
- if (!GetManifestOffset(&manifest_offset))
- return false;
+ uint64_t manifest_offset = GetManifestOffset();
CHECK_GE(payload.size(), manifest_offset + manifest_size_);
return out_manifest->ParseFromArray(&payload[manifest_offset],
manifest_size_);
@@ -171,7 +143,7 @@
<< metadata_signature;
return ErrorCode::kDownloadMetadataSignatureError;
}
- } else if (major_payload_version_ == kBrilloMajorPayloadVersion) {
+ } else {
metadata_signature_protobuf_blob.assign(
payload.begin() + metadata_size_,
payload.begin() + metadata_size_ + metadata_signature_size_);
@@ -243,8 +215,7 @@
TEST_AND_RETURN_FALSE(GetManifest(payload, manifest));
}
- if (metadata_signatures != nullptr &&
- GetMajorVersion() >= kBrilloMajorPayloadVersion) {
+ if (metadata_signatures != nullptr) {
payload.clear();
TEST_AND_RETURN_FALSE(utils::ReadFileChunk(
payload_path, GetMetadataSize(), GetMetadataSignatureSize(), &payload));
diff --git a/payload_consumer/payload_metadata.h b/payload_consumer/payload_metadata.h
index ec8eea6..be43c41 100644
--- a/payload_consumer/payload_metadata.h
+++ b/payload_consumer/payload_metadata.h
@@ -94,14 +94,12 @@
Signatures* metadata_signatures);
private:
- // Set |*out_offset| to the byte offset at which the manifest protobuf begins
- // in a payload. Return true on success, false if the offset is unknown.
- bool GetManifestOffset(uint64_t* out_offset) const;
+ // Returns the byte offset at which the manifest protobuf begins in a payload.
+ uint64_t GetManifestOffset() const;
- // Set |*out_offset| to the byte offset where the size of the metadata
- // signature is stored in a payload. Return true on success, if this field is
- // not present in the payload, return false.
- bool GetMetadataSignatureSizeOffset(uint64_t* out_offset) const;
+ // Returns the byte offset where the size of the metadata signature is stored
+ // in a payload.
+ uint64_t GetMetadataSignatureSizeOffset() const;
uint64_t metadata_size_{0};
uint64_t manifest_size_{0};