Allow payload_metadata to take raw pointers with size

This way, callers of payload_metadata don't have to store their data in
std::vector. This makes parsing a `mmap()`ed payload file possible.
While we don't need the ability to parse an mmap()ed payload on device,
it is really handy for parsing payload from host-side tooling. In which
case the entire payload will be available on disk anyway, and a
streaming parse will complicate code a lot.

Test: treehugger
Change-Id: Icfbd8e849093c8f389ea802864680ab214bdd721
diff --git a/payload_consumer/payload_metadata.cc b/payload_consumer/payload_metadata.cc
index 2cb73eb..f797723 100644
--- a/payload_consumer/payload_metadata.cc
+++ b/payload_consumer/payload_metadata.cc
@@ -50,12 +50,17 @@
 
 MetadataParseResult PayloadMetadata::ParsePayloadHeader(
     const brillo::Blob& payload, ErrorCode* error) {
+  return ParsePayloadHeader(payload.data(), payload.size(), error);
+}
+
+MetadataParseResult PayloadMetadata::ParsePayloadHeader(
+    const unsigned char* payload, size_t size, ErrorCode* error) {
   // Ensure we have data to cover the major payload version.
-  if (payload.size() < kDeltaManifestSizeOffset)
+  if (size < kDeltaManifestSizeOffset)
     return MetadataParseResult::kInsufficientData;
 
   // Validate the magic string.
-  if (memcmp(payload.data(), kDeltaMagic, sizeof(kDeltaMagic)) != 0) {
+  if (memcmp(payload, kDeltaMagic, sizeof(kDeltaMagic)) != 0) {
     LOG(ERROR) << "Bad payload format -- invalid delta magic: "
                << base::StringPrintf("%02x%02x%02x%02x",
                                      payload[0],
@@ -74,7 +79,7 @@
 
   uint64_t manifest_offset = GetManifestOffset();
   // Check again with the manifest offset.
-  if (payload.size() < manifest_offset)
+  if (size < manifest_offset)
     return MetadataParseResult::kInsufficientData;
 
   // Extract the payload version from the metadata.
@@ -136,8 +141,14 @@
 
 bool PayloadMetadata::GetManifest(const brillo::Blob& payload,
                                   DeltaArchiveManifest* out_manifest) const {
+  return GetManifest(payload.data(), payload.size(), out_manifest);
+}
+
+bool PayloadMetadata::GetManifest(const unsigned char* payload,
+                                  size_t size,
+                                  DeltaArchiveManifest* out_manifest) const {
   uint64_t manifest_offset = GetManifestOffset();
-  CHECK_GE(payload.size(), manifest_offset + manifest_size_);
+  CHECK_GE(size, manifest_offset + manifest_size_);
   return out_manifest->ParseFromArray(&payload[manifest_offset],
                                       manifest_size_);
 }