// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Unit tests for SecureBlob. #include "brillo/secure_blob.h" #include <algorithm> #include <iterator> #include <numeric> #include <base/logging.h> #include <gtest/gtest.h> namespace brillo { using std::string; class SecureBlobTest : public ::testing::Test { public: SecureBlobTest() {} virtual ~SecureBlobTest() {} static bool FindBlobInBlob(const brillo::Blob& haystack, const brillo::Blob& needle) { auto pos = std::search( haystack.begin(), haystack.end(), needle.begin(), needle.end()); return (pos != haystack.end()); } static int FindBlobIndexInBlob(const brillo::Blob& haystack, const brillo::Blob& needle) { auto pos = std::search( haystack.begin(), haystack.end(), needle.begin(), needle.end()); if (pos == haystack.end()) { return -1; } return std::distance(haystack.begin(), pos); } private: DISALLOW_COPY_AND_ASSIGN(SecureBlobTest); }; TEST_F(SecureBlobTest, AllocationSizeTest) { // Check that allocating a SecureBlob of a specified size works SecureBlob blob(32); EXPECT_EQ(32, blob.size()); } TEST_F(SecureBlobTest, AllocationCopyTest) { // Check that allocating a SecureBlob with an iterator works unsigned char from_data[32]; std::iota(std::begin(from_data), std::end(from_data), 0); SecureBlob blob(std::begin(from_data), std::end(from_data)); EXPECT_EQ(sizeof(from_data), blob.size()); for (unsigned int i = 0; i < sizeof(from_data); i++) { EXPECT_EQ(from_data[i], blob[i]); } } TEST_F(SecureBlobTest, IteratorConstructorTest) { // Check that allocating a SecureBlob with an iterator works brillo::Blob from_blob(32); for (unsigned int i = 0; i < from_blob.size(); i++) { from_blob[i] = i; } SecureBlob blob(from_blob.begin(), from_blob.end()); EXPECT_EQ(from_blob.size(), blob.size()); EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(from_blob, blob)); } TEST_F(SecureBlobTest, ResizeTest) { // Check that resizing a SecureBlob wipes the excess memory. The test assumes // that resize() down by one will not re-allocate the memory, so the last byte // will still be part of the SecureBlob's allocation size_t length = 1024; SecureBlob blob(length); void* original_data = blob.data(); for (size_t i = 0; i < length; i++) { blob[i] = i; } blob.resize(length - 1); EXPECT_EQ(original_data, blob.data()); EXPECT_EQ(length - 1, blob.size()); EXPECT_EQ(0, blob.data()[length - 1]); } TEST_F(SecureBlobTest, CombineTest) { SecureBlob blob1(32); SecureBlob blob2(32); std::iota(blob1.begin(), blob1.end(), 0); std::iota(blob2.begin(), blob2.end(), 32); SecureBlob combined_blob = SecureBlob::Combine(blob1, blob2); EXPECT_EQ(combined_blob.size(), (blob1.size() + blob2.size())); EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(combined_blob, blob1)); EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(combined_blob, blob2)); int blob1_index = SecureBlobTest::FindBlobIndexInBlob(combined_blob, blob1); int blob2_index = SecureBlobTest::FindBlobIndexInBlob(combined_blob, blob2); EXPECT_EQ(blob1_index, 0); EXPECT_EQ(blob2_index, 32); } TEST_F(SecureBlobTest, BlobToStringTest) { std::string test_string("Test String"); SecureBlob blob = SecureBlob(test_string.begin(), test_string.end()); EXPECT_EQ(blob.size(), test_string.length()); std::string result_string = blob.to_string(); EXPECT_EQ(test_string.compare(result_string), 0); } } // namespace brillo