1 //
2 // Copyright (C) 2011 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include "shill/crypto_provider.h"
18
19 #include <string>
20
21 #include <base/files/file_util.h>
22 #include <base/files/scoped_temp_dir.h>
23 #include <gtest/gtest.h>
24
25 #include "shill/crypto_des_cbc.h"
26 #include "shill/crypto_rot47.h"
27
28 using base::FilePath;
29 using base::ScopedTempDir;
30 using std::string;
31 using testing::Test;
32
33 namespace shill {
34
35 namespace {
36 const char kTestKey[] = "12345678";
37 const char kTestIV[] = "abcdefgh";
38 const char kKeyMatterFile[] = "key-matter-file";
39 const char kEmptyText[] = "";
40 const char kPlainText[] = "This is a test!";
41 const char kROT47Text[] = "rot47:%9:D :D 2 E6DEP";
42 const char kDESCBCText[] = "des-cbc:02:bKlHDISdHMFc0teQd4mAVrXgwlSj6iA+";
43 } // namespace
44
45 class CryptoProviderTest : public Test {
46 public:
CryptoProviderTest()47 CryptoProviderTest() {}
48
49 protected:
50 FilePath InitKeyMatterFile(const FilePath& dir);
51
52 CryptoProvider provider_;
53 };
54
InitKeyMatterFile(const FilePath & dir)55 FilePath CryptoProviderTest::InitKeyMatterFile(const FilePath& dir) {
56 FilePath path = dir.Append(kKeyMatterFile);
57 string matter = string(kTestIV) + kTestKey;
58 base::WriteFile(path, matter.data(), matter.size());
59 return path;
60 }
61
TEST_F(CryptoProviderTest,Init)62 TEST_F(CryptoProviderTest, Init) {
63 EXPECT_EQ(CryptoProvider::kKeyMatterFile, provider_.key_matter_file_.value());
64
65 provider_.set_key_matter_file(FilePath("/some/non/existent/file"));
66 provider_.Init();
67 ASSERT_EQ(1, provider_.cryptos_.size());
68 EXPECT_EQ(CryptoROT47::kID, provider_.cryptos_[0]->GetID());
69
70 ScopedTempDir temp_dir;
71 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
72 provider_.set_key_matter_file(InitKeyMatterFile(temp_dir.path()));
73 provider_.Init();
74 ASSERT_EQ(2, provider_.cryptos_.size());
75 EXPECT_EQ(CryptoDESCBC::kID, provider_.cryptos_[0]->GetID());
76 EXPECT_EQ(CryptoROT47::kID, provider_.cryptos_[1]->GetID());
77
78 provider_.set_key_matter_file(FilePath("/other/missing/file"));
79 provider_.Init();
80 ASSERT_EQ(1, provider_.cryptos_.size());
81 EXPECT_EQ(CryptoROT47::kID, provider_.cryptos_[0]->GetID());
82 }
83
TEST_F(CryptoProviderTest,Encrypt)84 TEST_F(CryptoProviderTest, Encrypt) {
85 EXPECT_EQ(kPlainText, provider_.Encrypt(kPlainText));
86 EXPECT_EQ(kEmptyText, provider_.Encrypt(kEmptyText));
87
88 provider_.Init();
89 EXPECT_EQ(kROT47Text, provider_.Encrypt(kPlainText));
90
91 ScopedTempDir temp_dir;
92 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
93 provider_.set_key_matter_file(InitKeyMatterFile(temp_dir.path()));
94 provider_.Init();
95 EXPECT_EQ(kROT47Text, provider_.Encrypt(kPlainText));
96 }
97
TEST_F(CryptoProviderTest,Decrypt)98 TEST_F(CryptoProviderTest, Decrypt) {
99 EXPECT_EQ(kPlainText, provider_.Decrypt(kPlainText));
100 EXPECT_EQ(kEmptyText, provider_.Decrypt(kEmptyText));
101
102 ScopedTempDir temp_dir;
103 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
104 provider_.set_key_matter_file(InitKeyMatterFile(temp_dir.path()));
105 provider_.Init();
106 EXPECT_EQ(kPlainText, provider_.Decrypt(kROT47Text));
107 EXPECT_EQ(kPlainText, provider_.Decrypt(kDESCBCText));
108 EXPECT_EQ(kPlainText, provider_.Decrypt(kPlainText));
109 EXPECT_EQ(kEmptyText, provider_.Decrypt(kEmptyText));
110 }
111
112 } // namespace shill
113