Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(109)

Unified Diff: payload_signer.cc

Issue 6271003: AU: Support signed payload verification through the delta generator. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/update_engine.git@master
Patch Set: Created 9 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « payload_signer.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: payload_signer.cc
diff --git a/payload_signer.cc b/payload_signer.cc
index cb113dae7cfbbe97d3bcd68abfb8601964ddd52c..60a80d1af051df2a15b341e21d03ede8ff1db723 100644
--- a/payload_signer.cc
+++ b/payload_signer.cc
@@ -43,25 +43,37 @@ bool ConvertSignatureToProtobufBlob(const vector<char> signature,
return true;
}
+bool LoadPayload(const string& payload_path,
+ vector<char>* out_payload,
+ DeltaArchiveManifest* out_manifest,
+ uint64_t* out_metadata_size) {
+ vector<char> payload;
+ // Loads the payload and parses the manifest.
+ TEST_AND_RETURN_FALSE(utils::ReadFile(payload_path, &payload));
+ LOG(INFO) << "Payload size: " << payload.size();
+ TEST_AND_RETURN_FALSE(DeltaPerformer::ParsePayloadMetadata(
+ payload, out_manifest, out_metadata_size) ==
+ DeltaPerformer::kMetadataParseSuccess);
+ LOG(INFO) << "Metadata size: " << *out_metadata_size;
+ out_payload->swap(payload);
+ return true;
+}
+
// Given an unsigned payload under |payload_path| and the |signature_blob_size|
// generates an updated payload that includes a dummy signature op in its
// manifest. Returns true on success, false otherwise.
-bool AddSignatureOpToPayload(const std::string& payload_path,
+bool AddSignatureOpToPayload(const string& payload_path,
int signature_blob_size,
vector<char>* out_payload) {
const int kProtobufOffset = 20;
const int kProtobufSizeOffset = 12;
+ // Loads the payload.
vector<char> payload;
- // Loads the payload and parses the manifest.
- TEST_AND_RETURN_FALSE(utils::ReadFile(payload_path, &payload));
- LOG(INFO) << "Original payload size: " << payload.size();
- uint64_t metadata_size;
DeltaArchiveManifest manifest;
- TEST_AND_RETURN_FALSE(DeltaPerformer::ParsePayloadMetadata(
- payload, &manifest, &metadata_size) ==
- DeltaPerformer::kMetadataParseSuccess);
- LOG(INFO) << "Metadata size: " << metadata_size;
+ uint64_t metadata_size;
+ TEST_AND_RETURN_FALSE(LoadPayload(
+ payload_path, &payload, &manifest, &metadata_size));
TEST_AND_RETURN_FALSE(!manifest.has_signatures_offset() &&
!manifest.has_signatures_size());
@@ -217,6 +229,32 @@ bool PayloadSigner::VerifySignature(const std::vector<char>& signature_blob,
return true;
}
+bool PayloadSigner::VerifySignedPayload(const std::string& payload_path,
+ const std::string& public_key_path) {
+ vector<char> payload;
+ DeltaArchiveManifest manifest;
+ uint64_t metadata_size;
+ TEST_AND_RETURN_FALSE(LoadPayload(
+ payload_path, &payload, &manifest, &metadata_size));
+ TEST_AND_RETURN_FALSE(manifest.has_signatures_offset() &&
+ manifest.has_signatures_size());
+ CHECK_EQ(payload.size(),
+ metadata_size + manifest.signatures_offset() +
+ manifest.signatures_size());
+ vector<char> signature_blob(
+ payload.begin() + metadata_size + manifest.signatures_offset(),
+ payload.end());
+ vector<char> signed_hash;
+ TEST_AND_RETURN_FALSE(VerifySignature(
+ signature_blob, public_key_path, &signed_hash));
+ TEST_AND_RETURN_FALSE(!signed_hash.empty());
+ vector<char> hash;
+ TEST_AND_RETURN_FALSE(OmahaHashCalculator::RawHashOfBytes(
+ payload.data(), metadata_size + manifest.signatures_offset(), &hash));
+ TEST_AND_RETURN_FALSE(hash == signed_hash);
+ return true;
+}
+
bool PayloadSigner::HashPayloadForSigning(const std::string& payload_path,
int signature_size,
vector<char>* out_hash_data) {
« no previous file with comments | « payload_signer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698