delta_generator: Include metadata signature in major version 2.

--metadata_signature_file flag does what it should now.
Note that you should only pass this flag if the payload you are signing is
version 2.

Bug: 23981164
TEST=unit test added.

Change-Id: I613cd6a5fef188eca37c46c3f8a0a41d1c22f2fd
diff --git a/payload_generator/payload_file.cc b/payload_generator/payload_file.cc
index 22efb94..17baf46 100644
--- a/payload_generator/payload_file.cc
+++ b/payload_generator/payload_file.cc
@@ -161,8 +161,8 @@
 
   // Signatures appear at the end of the blobs. Note the offset in the
   // manifest_.
+  uint64_t signature_blob_length = 0;
   if (!private_key_path.empty()) {
-    uint64_t signature_blob_length = 0;
     TEST_AND_RETURN_FALSE(
         PayloadSigner::SignatureBlobLength(vector<string>(1, private_key_path),
                                            &signature_blob_length));
@@ -194,11 +194,17 @@
   TEST_AND_RETURN_FALSE(WriteUint64AsBigEndian(&writer,
                                                serialized_manifest.size()));
 
+  // Write metadata signature size.
+  uint32_t metadata_signature_size = 0;
   if (major_version_ == kBrilloMajorPayloadVersion) {
-    // Write metadata signature size.
-    uint32_t zero = htobe32(0);
-    TEST_AND_RETURN_FALSE(writer.Write(&zero, sizeof(zero)));
-    metadata_size += sizeof(zero);
+    // Metadata signature has the same size as payload signature, because they
+    // are both the same kind of signature for the same kind of hash.
+    uint32_t metadata_signature_size = htobe32(signature_blob_length);
+    TEST_AND_RETURN_FALSE(writer.Write(&metadata_signature_size,
+                                       sizeof(metadata_signature_size)));
+    metadata_size += sizeof(metadata_signature_size);
+    // Set correct size instead of big endian size.
+    metadata_signature_size = signature_blob_length;
   }
 
   // Write protobuf
@@ -207,6 +213,21 @@
   TEST_AND_RETURN_FALSE(writer.Write(serialized_manifest.data(),
                                      serialized_manifest.size()));
 
+  // Write metadata signature blob.
+  if (major_version_ == kBrilloMajorPayloadVersion &&
+      !private_key_path.empty()) {
+    brillo::Blob metadata_hash, metadata_signature;
+    TEST_AND_RETURN_FALSE(OmahaHashCalculator::RawHashOfFile(payload_file,
+                                                             metadata_size,
+                                                             &metadata_hash));
+    TEST_AND_RETURN_FALSE(
+        PayloadSigner::SignHashWithKeys(metadata_hash,
+                                        vector<string>(1, private_key_path),
+                                        &metadata_signature));
+    TEST_AND_RETURN_FALSE(writer.Write(metadata_signature.data(),
+                                       metadata_signature.size()));
+  }
+
   // Append the data blobs
   LOG(INFO) << "Writing final delta file data blobs...";
   int blobs_fd = open(ordered_blobs_path.c_str(), O_RDONLY, 0);
@@ -223,7 +244,7 @@
     TEST_AND_RETURN_FALSE(writer.Write(buf.data(), rc));
   }
 
-  // Write signature blob.
+  // Write payload signature blob.
   if (!private_key_path.empty()) {
     LOG(INFO) << "Signing the update...";
     brillo::Blob signature_blob;
@@ -231,8 +252,8 @@
         payload_file,
         vector<string>(1, private_key_path),
         metadata_size,
-        0,
-        metadata_size + manifest_.signatures_offset(),
+        metadata_signature_size,
+        metadata_size + metadata_signature_size + manifest_.signatures_offset(),
         &signature_blob));
     TEST_AND_RETURN_FALSE(writer.Write(signature_blob.data(),
                                        signature_blob.size()));