aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaksim Ivanov <emaxx@google.com>2018-06-07 00:01:08 +0200
committerchrome-bot <chrome-bot@chromium.org>2018-06-07 23:33:43 -0700
commitaeb7bb4b05662d0ccd8a6104414dbc5af71f6ad5 (patch)
tree3ad3b48829e37573f8d2ef436b043b446014d529
parent30b3a16baa5859ac5934f81c385ded0c84a68525 (diff)
downloadplatform_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.cc11
-rw-r--r--brillo/secure_blob.h4
-rw-r--r--brillo/secure_blob_unittest.cc15
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() {}