• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
7 #include "brillo/secure_blob.h"
8 
9 #include <algorithm>
10 #include <iterator>
11 #include <numeric>
12 
13 #include <base/logging.h>
14 #include <gtest/gtest.h>
15 
16 namespace brillo {
17 using std::string;
18 
19 class SecureBlobTest : public ::testing::Test {
20  public:
SecureBlobTest()21   SecureBlobTest() {}
~SecureBlobTest()22   virtual ~SecureBlobTest() {}
23 
FindBlobInBlob(const brillo::Blob & haystack,const brillo::Blob & needle)24   static bool FindBlobInBlob(const brillo::Blob& haystack,
25                              const brillo::Blob& needle) {
26     auto pos = std::search(
27         haystack.begin(), haystack.end(), needle.begin(), needle.end());
28     return (pos != haystack.end());
29   }
30 
FindBlobIndexInBlob(const brillo::Blob & haystack,const brillo::Blob & needle)31   static int FindBlobIndexInBlob(const brillo::Blob& haystack,
32                                  const brillo::Blob& needle) {
33     auto pos = std::search(
34         haystack.begin(), haystack.end(), needle.begin(), needle.end());
35     if (pos == haystack.end()) {
36       return -1;
37     }
38     return std::distance(haystack.begin(), pos);
39   }
40 
41  private:
42   DISALLOW_COPY_AND_ASSIGN(SecureBlobTest);
43 };
44 
TEST_F(SecureBlobTest,AllocationSizeTest)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 
TEST_F(SecureBlobTest,AllocationCopyTest)52 TEST_F(SecureBlobTest, AllocationCopyTest) {
53   // Check that allocating a SecureBlob with an iterator works
54   unsigned char from_data[32];
55   std::iota(std::begin(from_data), std::end(from_data), 0);
56 
57   SecureBlob blob(std::begin(from_data), std::end(from_data));
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 
TEST_F(SecureBlobTest,IteratorConstructorTest)66 TEST_F(SecureBlobTest, IteratorConstructorTest) {
67   // Check that allocating a SecureBlob with an iterator works
68   brillo::Blob from_blob(32);
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 
TEST_F(SecureBlobTest,ResizeTest)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
83   size_t length = 1024;
84   SecureBlob blob(length);
85   void* original_data = blob.data();
86   for (size_t i = 0; i < length; i++) {
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());
94   EXPECT_EQ(0, blob.data()[length - 1]);
95 }
96 
TEST_F(SecureBlobTest,CombineTest)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 
TEST_F(SecureBlobTest,BlobToStringTest)112 TEST_F(SecureBlobTest, BlobToStringTest) {
113   std::string test_string("Test String");
114   SecureBlob blob = SecureBlob(test_string.begin(), test_string.end());
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 
120 }  // namespace brillo
121