Allow a given payload to be signed more than once.
If the signature sizes don't change, we can insert signatures, and then
overwrite them without touching anything else. This makes it possible
for us to insert placeholder signatures, generate our hashes to be signed,
sign them, and then insert the signatures.
However, this doesn't change the command line arguments to take advantage of
this yet.
BUG=chromium:224453
TEST=Unittests (including one new one)
Change-Id: I7847edcee613bcc6da3e55d706a7e1bf95b5afaf
Reviewed-on: https://chromium-review.googlesource.com/174791
Reviewed-by: Chris Sosa <sosa@chromium.org>
Commit-Queue: Don Garrett <dgarrett@chromium.org>
Tested-by: Don Garrett <dgarrett@chromium.org>
diff --git a/delta_performer_unittest.cc b/delta_performer_unittest.cc
index c2b57e2..7836335 100644
--- a/delta_performer_unittest.cc
+++ b/delta_performer_unittest.cc
@@ -75,6 +75,8 @@
kSignatureNone, // No payload signing.
kSignatureGenerator, // Sign the payload at generation time.
kSignatureGenerated, // Sign the payload after it's generated.
+ kSignatureGeneratedPlaceholder, // Insert placeholder signatures, then real.
+ kSignatureGeneratedPlaceholderMismatch, // Insert a wrong sized placeholder.
kSignatureGeneratedShell, // Sign the generated payload through shell cmds.
kSignatureGeneratedShellBadKey, // Sign with a bad key through shell cmds.
kSignatureGeneratedShellRotateCl1, // Rotate key, test client v1
@@ -134,6 +136,19 @@
return signature.size();
}
+static bool InsertSignaturePlaceholder(int signature_size,
+ const string& payload_path,
+ uint64_t* out_metadata_size) {
+ vector<vector<char> > signatures;
+ signatures.push_back(vector<char>(signature_size, 0));
+
+ return PayloadSigner::AddSignatureToPayload(
+ payload_path,
+ signatures,
+ payload_path,
+ out_metadata_size);
+}
+
static void SignGeneratedPayload(const string& payload_path,
uint64_t* out_metadata_size) {
int signature_size = GetSignatureSize(kUnittestPrivateKeyPath);
@@ -450,10 +465,30 @@
&state->metadata_size));
}
- if (signature_test == kSignatureGenerated) {
+ if (signature_test == kSignatureGeneratedPlaceholder ||
+ signature_test == kSignatureGeneratedPlaceholderMismatch) {
+
+ int signature_size = GetSignatureSize(kUnittestPrivateKeyPath);
+ LOG(INFO) << "Inserting placeholder signature.";
+ ASSERT_TRUE(InsertSignaturePlaceholder(signature_size, state->delta_path,
+ &state->metadata_size));
+
+ if (signature_test == kSignatureGeneratedPlaceholderMismatch) {
+ signature_size -= 1;
+ LOG(INFO) << "Inserting mismatched placeholder signature.";
+ ASSERT_FALSE(InsertSignaturePlaceholder(signature_size, state->delta_path,
+ &state->metadata_size));
+ return;
+ }
+ }
+
+ if (signature_test == kSignatureGenerated ||
+ signature_test == kSignatureGeneratedPlaceholder ||
+ signature_test == kSignatureGeneratedPlaceholderMismatch) {
// Generate the signed payload and update the metadata size in state to
// reflect the new size after adding the signature operation to the
// manifest.
+ LOG(INFO) << "Signing payload.";
SignGeneratedPayload(state->delta_path, &state->metadata_size);
} else if (signature_test == kSignatureGeneratedShell ||
signature_test == kSignatureGeneratedShellBadKey ||
@@ -943,6 +978,17 @@
false);
}
+TEST(DeltaPerformerTest, RunAsRootSmallImageSignaturePlaceholderTest) {
+ DoSmallImageTest(false, false, false, -1, kSignatureGeneratedPlaceholder,
+ false);
+}
+
+TEST(DeltaPerformerTest, RunAsRootSmallImageSignaturePlaceholderMismatchTest) {
+ DeltaState state;
+ GenerateDeltaFile(false, false, false, -1,
+ kSignatureGeneratedPlaceholderMismatch, &state);
+}
+
TEST(DeltaPerformerTest, RunAsRootSmallImageChunksTest) {
DoSmallImageTest(false, false, false, kBlockSize, kSignatureGenerator,
false);