diff options
author | Maksim Ivanov <emaxx@google.com> | 2018-06-07 00:01:08 +0200 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-06-07 23:33:43 -0700 |
commit | aeb7bb4b05662d0ccd8a6104414dbc5af71f6ad5 (patch) | |
tree | 3ad3b48829e37573f8d2ef436b043b446014d529 | |
parent | 30b3a16baa5859ac5934f81c385ded0c84a68525 (diff) | |
download | platform_external_libbrillo-aeb7bb4b05662d0ccd8a6104414dbc5af71f6ad5.tar.gz platform_external_libbrillo-aeb7bb4b05662d0ccd8a6104414dbc5af71f6ad5.tar.bz2 platform_external_libbrillo-aeb7bb4b05662d0ccd8a6104414dbc5af71f6ad5.zip |
libbrillo: Blob combining utility
Add a function that concatenates given Blob's.
This provides analogous functionality of SecureBlob::Combine()
to Blob.
BUG=chromium:728047
TEST=new unit test (BlobTest.CombineBlobs)
Change-Id: I33218bd81a49a265d021e7afdcf438b7fc70921d
Reviewed-on: https://chromium-review.googlesource.com/1089338
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Maksim Ivanov <emaxx@chromium.org>
Reviewed-by: Jorge Lucangeli Obes <jorgelo@chromium.org>
-rw-r--r-- | brillo/secure_blob.cc | 11 | ||||
-rw-r--r-- | brillo/secure_blob.h | 4 | ||||
-rw-r--r-- | brillo/secure_blob_unittest.cc | 15 |
3 files changed, 30 insertions, 0 deletions
diff --git a/brillo/secure_blob.cc b/brillo/secure_blob.cc index 70c6f6e..4294b14 100644 --- a/brillo/secure_blob.cc +++ b/brillo/secure_blob.cc @@ -18,6 +18,17 @@ Blob BlobFromString(const std::string& bytes) { return Blob(bytes.begin(), bytes.end()); } +Blob CombineBlobs(const std::initializer_list<Blob>& blobs) { + size_t total_size = 0; + for (const auto& blob : blobs) + total_size += blob.size(); + Blob concatenation; + concatenation.reserve(total_size); + for (const auto& blob : blobs) + concatenation.insert(concatenation.end(), blob.begin(), blob.end()); + return concatenation; +} + SecureBlob::SecureBlob(const Blob& blob) : SecureBlob(blob.begin(), blob.end()) {} diff --git a/brillo/secure_blob.h b/brillo/secure_blob.h index 41a5cc6..d2fe9c7 100644 --- a/brillo/secure_blob.h +++ b/brillo/secure_blob.h @@ -5,6 +5,7 @@ #ifndef LIBBRILLO_BRILLO_SECURE_BLOB_H_ #define LIBBRILLO_BRILLO_SECURE_BLOB_H_ +#include <initializer_list> #include <string> #include <vector> @@ -20,6 +21,9 @@ using Blob = std::vector<uint8_t>; BRILLO_EXPORT std::string BlobToString(const Blob& blob); BRILLO_EXPORT Blob BlobFromString(const std::string& bytes); +// Returns a concatenation of given Blobs. +BRILLO_EXPORT Blob CombineBlobs(const std::initializer_list<Blob>& blobs); + // SecureBlob erases the contents on destruction. It does not guarantee erasure // on resize, assign, etc. class BRILLO_EXPORT SecureBlob : public Blob { diff --git a/brillo/secure_blob_unittest.cc b/brillo/secure_blob_unittest.cc index b1c2d94..9fcba85 100644 --- a/brillo/secure_blob_unittest.cc +++ b/brillo/secure_blob_unittest.cc @@ -30,6 +30,21 @@ TEST(BlobTest, StringConversions) { EXPECT_EQ(blob, obtained_blob); } +// Tests CombineBlobs(). +TEST(BlobTest, CombineBlobs) { + const Blob kEmpty; + const Blob kBlob1 = {1}; + const Blob kBlob2 = {2}; + const Blob kBlob3 = {3}; + const Blob kBlob12 = {1, 2}; + const Blob kBlob123 = {1, 2, 3}; + EXPECT_EQ(kBlob123, CombineBlobs({kBlob12, kBlob3})); + EXPECT_EQ(kBlob123, CombineBlobs({kBlob1, kBlob2, kBlob3})); + EXPECT_EQ(kBlob12, CombineBlobs({kBlob12})); + EXPECT_EQ(kBlob12, CombineBlobs({kEmpty, kBlob1, kEmpty, kBlob2, kEmpty})); + EXPECT_EQ(kEmpty, CombineBlobs({})); +} + class SecureBlobTest : public ::testing::Test { public: SecureBlobTest() {} |