Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | // Unit tests for SecureBlob. |
| 6 | |
Alex Vakulenko | 9ed0cab | 2015-10-12 15:21:28 -0700 | [diff] [blame] | 7 | #include "brillo/secure_blob.h" |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 8 | |
Utkarsh Sanghi | c411f7f | 2014-09-08 15:01:31 -0700 | [diff] [blame] | 9 | #include <algorithm> |
| 10 | #include <iterator> |
| 11 | #include <numeric> |
| 12 | |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 13 | #include <base/logging.h> |
| 14 | #include <gtest/gtest.h> |
| 15 | |
Alex Vakulenko | 9ed0cab | 2015-10-12 15:21:28 -0700 | [diff] [blame] | 16 | namespace brillo { |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 17 | using std::string; |
| 18 | |
| 19 | class SecureBlobTest : public ::testing::Test { |
| 20 | public: |
Alex Vakulenko | 05d2904 | 2015-01-13 09:39:25 -0800 | [diff] [blame] | 21 | SecureBlobTest() {} |
| 22 | virtual ~SecureBlobTest() {} |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 23 | |
Alex Vakulenko | 9ed0cab | 2015-10-12 15:21:28 -0700 | [diff] [blame] | 24 | static bool FindBlobInBlob(const brillo::Blob& haystack, |
| 25 | const brillo::Blob& needle) { |
Alex Vakulenko | 05d2904 | 2015-01-13 09:39:25 -0800 | [diff] [blame] | 26 | auto pos = std::search( |
| 27 | haystack.begin(), haystack.end(), needle.begin(), needle.end()); |
Utkarsh Sanghi | c411f7f | 2014-09-08 15:01:31 -0700 | [diff] [blame] | 28 | return (pos != haystack.end()); |
| 29 | } |
| 30 | |
Alex Vakulenko | 9ed0cab | 2015-10-12 15:21:28 -0700 | [diff] [blame] | 31 | static int FindBlobIndexInBlob(const brillo::Blob& haystack, |
| 32 | const brillo::Blob& needle) { |
Alex Vakulenko | 05d2904 | 2015-01-13 09:39:25 -0800 | [diff] [blame] | 33 | auto pos = std::search( |
| 34 | haystack.begin(), haystack.end(), needle.begin(), needle.end()); |
Utkarsh Sanghi | c411f7f | 2014-09-08 15:01:31 -0700 | [diff] [blame] | 35 | if (pos == haystack.end()) { |
| 36 | return -1; |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 37 | } |
Utkarsh Sanghi | c411f7f | 2014-09-08 15:01:31 -0700 | [diff] [blame] | 38 | return std::distance(haystack.begin(), pos); |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 39 | } |
| 40 | |
| 41 | private: |
| 42 | DISALLOW_COPY_AND_ASSIGN(SecureBlobTest); |
| 43 | }; |
| 44 | |
| 45 | TEST_F(SecureBlobTest, AllocationSizeTest) { |
| 46 | // Check that allocating a SecureBlob of a specified size works |
| 47 | SecureBlob blob(32); |
| 48 | |
| 49 | EXPECT_EQ(32, blob.size()); |
| 50 | } |
| 51 | |
| 52 | TEST_F(SecureBlobTest, AllocationCopyTest) { |
| 53 | // Check that allocating a SecureBlob with an iterator works |
| 54 | unsigned char from_data[32]; |
Alex Vakulenko | c3c53ee | 2015-03-25 16:21:34 -0700 | [diff] [blame] | 55 | std::iota(std::begin(from_data), std::end(from_data), 0); |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 56 | |
Alex Vakulenko | c3c53ee | 2015-03-25 16:21:34 -0700 | [diff] [blame] | 57 | SecureBlob blob(std::begin(from_data), std::end(from_data)); |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 58 | |
| 59 | EXPECT_EQ(sizeof(from_data), blob.size()); |
| 60 | |
| 61 | for (unsigned int i = 0; i < sizeof(from_data); i++) { |
| 62 | EXPECT_EQ(from_data[i], blob[i]); |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | TEST_F(SecureBlobTest, IteratorConstructorTest) { |
| 67 | // Check that allocating a SecureBlob with an iterator works |
Alex Vakulenko | 9ed0cab | 2015-10-12 15:21:28 -0700 | [diff] [blame] | 68 | brillo::Blob from_blob(32); |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 69 | for (unsigned int i = 0; i < from_blob.size(); i++) { |
| 70 | from_blob[i] = i; |
| 71 | } |
| 72 | |
| 73 | SecureBlob blob(from_blob.begin(), from_blob.end()); |
| 74 | |
| 75 | EXPECT_EQ(from_blob.size(), blob.size()); |
| 76 | EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(from_blob, blob)); |
| 77 | } |
| 78 | |
| 79 | TEST_F(SecureBlobTest, ResizeTest) { |
| 80 | // Check that resizing a SecureBlob wipes the excess memory. The test assumes |
| 81 | // that resize() down by one will not re-allocate the memory, so the last byte |
| 82 | // will still be part of the SecureBlob's allocation |
Alex Vakulenko | c3c53ee | 2015-03-25 16:21:34 -0700 | [diff] [blame] | 83 | size_t length = 1024; |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 84 | SecureBlob blob(length); |
| 85 | void* original_data = blob.data(); |
Alex Vakulenko | c3c53ee | 2015-03-25 16:21:34 -0700 | [diff] [blame] | 86 | for (size_t i = 0; i < length; i++) { |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 87 | blob[i] = i; |
| 88 | } |
| 89 | |
| 90 | blob.resize(length - 1); |
| 91 | |
| 92 | EXPECT_EQ(original_data, blob.data()); |
| 93 | EXPECT_EQ(length - 1, blob.size()); |
Alex Vakulenko | c3c53ee | 2015-03-25 16:21:34 -0700 | [diff] [blame] | 94 | EXPECT_EQ(0, blob.data()[length - 1]); |
Darren Krahn | fcb4e19 | 2012-06-08 14:52:47 -0700 | [diff] [blame] | 95 | } |
| 96 | |
Utkarsh Sanghi | c411f7f | 2014-09-08 15:01:31 -0700 | [diff] [blame] | 97 | TEST_F(SecureBlobTest, CombineTest) { |
| 98 | SecureBlob blob1(32); |
| 99 | SecureBlob blob2(32); |
| 100 | std::iota(blob1.begin(), blob1.end(), 0); |
| 101 | std::iota(blob2.begin(), blob2.end(), 32); |
| 102 | SecureBlob combined_blob = SecureBlob::Combine(blob1, blob2); |
| 103 | EXPECT_EQ(combined_blob.size(), (blob1.size() + blob2.size())); |
| 104 | EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(combined_blob, blob1)); |
| 105 | EXPECT_TRUE(SecureBlobTest::FindBlobInBlob(combined_blob, blob2)); |
| 106 | int blob1_index = SecureBlobTest::FindBlobIndexInBlob(combined_blob, blob1); |
| 107 | int blob2_index = SecureBlobTest::FindBlobIndexInBlob(combined_blob, blob2); |
| 108 | EXPECT_EQ(blob1_index, 0); |
| 109 | EXPECT_EQ(blob2_index, 32); |
| 110 | } |
| 111 | |
| 112 | TEST_F(SecureBlobTest, BlobToStringTest) { |
| 113 | std::string test_string("Test String"); |
Alex Vakulenko | c3c53ee | 2015-03-25 16:21:34 -0700 | [diff] [blame] | 114 | SecureBlob blob = SecureBlob(test_string.begin(), test_string.end()); |
Utkarsh Sanghi | c411f7f | 2014-09-08 15:01:31 -0700 | [diff] [blame] | 115 | EXPECT_EQ(blob.size(), test_string.length()); |
| 116 | std::string result_string = blob.to_string(); |
| 117 | EXPECT_EQ(test_string.compare(result_string), 0); |
| 118 | } |
| 119 | |
Alex Vakulenko | 9ed0cab | 2015-10-12 15:21:28 -0700 | [diff] [blame] | 120 | } // namespace brillo |