Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: components/os_crypt/os_crypt_util_linux_unittest.cc

Issue 1973483002: OSCrypt for POSIX uses libsecret to store a randomised encryption key. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Refactored CL Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium 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 #include <dlfcn.h>
6 #include <memory>
7 #include <string>
8 #include <utility>
9
10 #include "base/logging.h"
11 #include "base/macros.h"
12 #include "components/os_crypt/key_storage_linux.h"
13 #include "components/os_crypt/libsecret_util_posix.h"
14 #include "components/os_crypt/os_crypt.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace {
18
19 struct MockSecretValue {
20 public:
21 std::unique_ptr<std::string> password;
22 explicit MockSecretValue(const gchar* password);
vabr (Chromium) 2016/05/13 15:10:19 nit: Please separate the methods from each other a
cfroussios 2016/05/13 17:09:13 Done.
23 ~MockSecretValue();
24 };
25
26 // Replaces some of LibsecretLoader's methods with mocked ones.
27 class MockLibsecretLoader : public LibsecretLoader {
28 public:
29 // Sets up the minimum mock implementation necessary for |Libsecret| to work.
vabr (Chromium) 2016/05/13 15:10:19 nit: Please separate methods with blank lines.
cfroussios 2016/05/13 17:09:13 Done.
30 // Also resets the state to mock a clean database.
31 static bool ResetForOSCrypt();
32 // Shorthand for setting OSCrypt's password in the libsecret mock to a
33 // specific value
34 static void SetOSCryptPassword(const char*);
35 };
36
37 MockSecretValue::MockSecretValue(const gchar* password)
38 : password(new std::string(password)) {}
39 MockSecretValue::~MockSecretValue() = default;
vabr (Chromium) 2016/05/13 15:10:19 nit: Please add a blank line above this one.
cfroussios 2016/05/13 17:09:13 Done.
40
41 std::unique_ptr<MockSecretValue> stored_password(nullptr);
vabr (Chromium) 2016/05/13 15:10:19 nit: No need to pass nullptr to a unique_ptr, just
vabr (Chromium) 2016/05/13 15:10:19 No non-POD data types as static variables (see my
vabr (Chromium) 2016/05/13 15:10:19 nit: Please use g_ as a prefix for global variable
cfroussios 2016/05/13 17:09:13 Acknowledged.
42
43 const gchar* mock_secret_value_get_text(MockSecretValue* value) {
44 return value->password->c_str();
45 }
46
47 gboolean mock_secret_password_store_sync(const SecretSchema* schema,
48 const gchar* collection,
49 const gchar* label,
50 const gchar* password,
51 GCancellable* cancellable,
52 GError** error,
53 ...) {
54 stored_password.reset(new MockSecretValue(password));
55 return true;
56 }
57
58 MockSecretValue* mock_secret_service_lookup_sync(SecretService* service,
59 const SecretSchema* schema,
60 GHashTable* attributes,
61 GCancellable* cancellable,
62 GError** error) {
63 return stored_password.get();
64 }
65
66 void mock_secret_value_unref(gpointer value) {}
67
68 GList* mock_secret_service_search_sync(SecretService* service,
69 const SecretSchema* schema,
70 GHashTable* attributes,
71 SecretSearchFlags flags,
72 GCancellable* cancellable,
73 GError** error) {
74 *error = nullptr;
75 return nullptr;
76 }
77
78 // static
79 bool MockLibsecretLoader::ResetForOSCrypt() {
80 // 4 methods used by Libsecret.GetPassword();
81 secret_password_store_sync = &mock_secret_password_store_sync;
82 secret_value_get_text =
83 (decltype(&::secret_value_get_text)) & mock_secret_value_get_text;
84 secret_value_unref = &mock_secret_value_unref;
85 secret_service_lookup_sync = (decltype(&::secret_service_lookup_sync)) &
86 mock_secret_service_lookup_sync;
87 // 1 method used by LibsecretLoader::EnsureLibsecretLoaded
88 secret_service_search_sync = &mock_secret_service_search_sync;
89
90 stored_password.reset(nullptr);
91 libsecret_loaded_ = true;
92
93 return true;
94 }
95
96 void MockLibsecretLoader::SetOSCryptPassword(const char* value) {
97 stored_password.reset(new MockSecretValue(value));
98 }
99
100 TEST(LibsecretTest, VerifyPosixMigrationCoexistance) {
101 const std::string originaltext = "hello";
102 std::string ciphertext;
103 std::string decipheredtext;
104 std::string decipheredtextV11;
105 std::string decipheredtextV10;
106
107 // Verify that there are 3 versions currently supported
108
109 KeyStorageMock* key_storage = OSCrypt::UseMockKeyStorage(true);
110
111 ASSERT_TRUE(OSCrypt::EncryptString(originaltext, &ciphertext));
vabr (Chromium) 2016/05/13 15:10:19 The three blocks do not seem to depend on each oth
cfroussios 2016/05/13 17:09:12 Done.
112 ASSERT_EQ(ciphertext.substr(0, 3), "v11");
113 ASSERT_TRUE(OSCrypt::DecryptString(ciphertext, &decipheredtextV11));
114 ASSERT_EQ(originaltext, decipheredtextV11);
115
116 key_storage->ResetTo(std::string("peanuts"));
117 ASSERT_TRUE(OSCrypt::EncryptString(originaltext, &ciphertext));
118 key_storage->ResetTo(std::string("not_peanuts"));
119 ciphertext = ciphertext.substr(3).insert(0, "v10");
120 ASSERT_TRUE(OSCrypt::DecryptString(ciphertext, &decipheredtextV10));
121 ASSERT_EQ(originaltext, decipheredtextV10);
122
123 ciphertext = originaltext; // No encryption
124 ASSERT_TRUE(OSCrypt::DecryptString(ciphertext, &decipheredtext));
125 ASSERT_EQ(originaltext, decipheredtext);
126
127 // Don't force a static configuration on other tests
128 OSCrypt::UseMockKeyStorage(false);
vabr (Chromium) 2016/05/13 15:10:19 It might be safer to define a test fixture (based
cfroussios 2016/05/13 17:09:12 Done.
129 }
130
131 TEST(LibsecretTest, LibsecretRepeats) {
132 KeyStorageLibsecret libsecret;
133 MockLibsecretLoader::ResetForOSCrypt();
134 std::string password = libsecret.GetKey();
135 EXPECT_NE(password, "");
vabr (Chromium) 2016/05/13 15:10:19 EXPECT_FALSE(password.empty());
cfroussios 2016/05/13 17:09:12 Done.
136 std::string password_repeat = libsecret.GetKey();
137 EXPECT_EQ(password, password_repeat);
138 }
139
140 TEST(LibsecretTest, LibsecretCreatesRandomised) {
141 KeyStorageLibsecret libsecret;
142 MockLibsecretLoader::ResetForOSCrypt();
143 std::string password = libsecret.GetKey();
144 MockLibsecretLoader::ResetForOSCrypt();
145 std::string password_new = libsecret.GetKey();
146 EXPECT_NE(password, password_new);
147 }
148
149 } // namespace
OLDNEW
« components/os_crypt/os_crypt_linux.cc ('K') | « components/os_crypt/os_crypt_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698