blob: 54ffe869a0ce861d7433d3f278d06d38dcaff16d [file] [log] [blame]
Yicheng Li1090c902020-11-10 11:31:43 -08001// Copyright 2020 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#include "u2fd/webauthn_storage.h"
6
7#include <memory>
8#include <string>
9
Qijiang Fan713061e2021-03-08 15:45:12 +090010#include <base/check.h>
Yicheng Li1090c902020-11-10 11:31:43 -080011#include <base/files/file_path.h>
12#include <base/files/file_util.h>
13#include <base/files/scoped_temp_dir.h>
14#include <base/strings/string_number_conversions.h>
15#include <base/time/time.h>
16#include <gmock/gmock.h>
17#include <gtest/gtest.h>
18
19namespace u2f {
20namespace {
21
22constexpr char kSanitizedUser[] = "SanitizedUser";
23
24constexpr char kCredentialId[] = "CredentialId";
25constexpr char kCredentialSecret[65] = {[0 ... 63] = 'E', '\0'};
26constexpr char kRpId[] = "example.com";
Yicheng Lid73908d2021-02-17 09:58:11 -080027constexpr char kRpDisplayName[] = "Example Site";
Yicheng Li1090c902020-11-10 11:31:43 -080028constexpr char kUserId[] = "deadbeef";
Yicheng Liaeb3d682020-11-19 11:07:57 -080029constexpr char kUserDisplayName[] = "example_user";
Yicheng Li1090c902020-11-10 11:31:43 -080030constexpr double kCreatedTime = 12345;
31
Yicheng Li4d27fa72020-12-10 11:09:21 -080032brillo::Blob HexArrayToBlob(const char* array) {
33 brillo::Blob blob;
34 CHECK(base::HexStringToBytes(array, &blob));
Yicheng Li1090c902020-11-10 11:31:43 -080035 return blob;
36}
37
38using ::testing::_;
39using ::testing::Return;
40
41class WebAuthnStorageTest : public ::testing::Test {
42 public:
43 WebAuthnStorageTest() {
44 CHECK(temp_dir_.CreateUniqueTempDir());
45 root_path_ =
46 temp_dir_.GetPath().AppendASCII("webauthn_storage_unittest_root");
47 webauthn_storage_ = std::make_unique<WebAuthnStorage>();
48 // Since there is no session manager, allow accesses by default.
49 webauthn_storage_->set_allow_access(true);
50 webauthn_storage_->set_sanitized_user(kSanitizedUser);
51 webauthn_storage_->SetRootPathForTesting(root_path_);
52 }
53
54 ~WebAuthnStorageTest() override {
hscham53cf73a2020-11-30 15:58:42 +090055 EXPECT_TRUE(base::DeletePathRecursively(temp_dir_.GetPath()));
Yicheng Li1090c902020-11-10 11:31:43 -080056 }
57
58 protected:
59 base::ScopedTempDir temp_dir_;
60 base::FilePath root_path_;
61 std::unique_ptr<WebAuthnStorage> webauthn_storage_;
62};
63
64TEST_F(WebAuthnStorageTest, WriteAndReadRecord) {
65 const WebAuthnRecord record{kCredentialId,
Yicheng Li4d27fa72020-12-10 11:09:21 -080066 HexArrayToBlob(kCredentialSecret),
Yicheng Liaeb3d682020-11-19 11:07:57 -080067 kRpId,
Yicheng Lid73908d2021-02-17 09:58:11 -080068 kRpDisplayName,
Yicheng Liaeb3d682020-11-19 11:07:57 -080069 kUserId,
70 kUserDisplayName,
Yicheng Lid73908d2021-02-17 09:58:11 -080071 kCreatedTime,
72 /* is_resident_key = */ true};
Yicheng Li1090c902020-11-10 11:31:43 -080073
74 EXPECT_TRUE(webauthn_storage_->WriteRecord(record));
75
76 webauthn_storage_->Reset();
77 webauthn_storage_->set_allow_access(true);
78 webauthn_storage_->set_sanitized_user(kSanitizedUser);
79
80 EXPECT_TRUE(webauthn_storage_->LoadRecords());
81
82 base::Optional<WebAuthnRecord> record_loaded =
83 webauthn_storage_->GetRecordByCredentialId(kCredentialId);
84 EXPECT_TRUE(record_loaded);
85 EXPECT_EQ(record.secret, record_loaded->secret);
86 EXPECT_EQ(record.rp_id, record_loaded->rp_id);
Yicheng Lid73908d2021-02-17 09:58:11 -080087 EXPECT_EQ(record.rp_display_name, record_loaded->rp_display_name);
Yicheng Li1090c902020-11-10 11:31:43 -080088 EXPECT_EQ(record.user_id, record_loaded->user_id);
Yicheng Liaeb3d682020-11-19 11:07:57 -080089 EXPECT_EQ(record.user_display_name, record_loaded->user_display_name);
90 EXPECT_EQ(record.timestamp, record_loaded->timestamp);
Yicheng Lid73908d2021-02-17 09:58:11 -080091 EXPECT_TRUE(record.is_resident_key);
Yicheng Liaeb3d682020-11-19 11:07:57 -080092}
93
94TEST_F(WebAuthnStorageTest, WriteAndReadRecordWithEmptyUserIdAndDisplayName) {
Yicheng Lid73908d2021-02-17 09:58:11 -080095 const WebAuthnRecord record{kCredentialId,
96 HexArrayToBlob(kCredentialSecret),
Yicheng Li4d27fa72020-12-10 11:09:21 -080097 kRpId,
Yicheng Lid73908d2021-02-17 09:58:11 -080098 kRpDisplayName,
99 /* user_id = */ std::string(),
100 /* user_display_name = */ std::string(),
101 kCreatedTime,
102 /* is_resident_key = */ false};
Yicheng Liaeb3d682020-11-19 11:07:57 -0800103
104 EXPECT_TRUE(webauthn_storage_->WriteRecord(record));
105
106 webauthn_storage_->Reset();
107 webauthn_storage_->set_allow_access(true);
108 webauthn_storage_->set_sanitized_user(kSanitizedUser);
109
110 EXPECT_TRUE(webauthn_storage_->LoadRecords());
111
112 base::Optional<WebAuthnRecord> record_loaded =
113 webauthn_storage_->GetRecordByCredentialId(kCredentialId);
114 EXPECT_TRUE(record_loaded);
115 EXPECT_EQ(record.secret, record_loaded->secret);
116 EXPECT_EQ(record.rp_id, record_loaded->rp_id);
Yicheng Lid73908d2021-02-17 09:58:11 -0800117 EXPECT_EQ(record.rp_display_name, record_loaded->rp_display_name);
Yicheng Liaeb3d682020-11-19 11:07:57 -0800118 EXPECT_TRUE(record_loaded->user_id.empty());
119 EXPECT_TRUE(record_loaded->user_display_name.empty());
Yicheng Li1090c902020-11-10 11:31:43 -0800120 EXPECT_EQ(record.timestamp, record_loaded->timestamp);
Yicheng Lid73908d2021-02-17 09:58:11 -0800121 EXPECT_FALSE(record.is_resident_key);
Yicheng Li1090c902020-11-10 11:31:43 -0800122}
123
Yicheng Li4d27fa72020-12-10 11:09:21 -0800124TEST_F(WebAuthnStorageTest, LoadManyRecords) {
125 for (int i = 0; i < 30; i++) {
126 const WebAuthnRecord record{std::string(kCredentialId) + std::to_string(i),
127 HexArrayToBlob(kCredentialSecret),
128 kRpId,
Yicheng Lid73908d2021-02-17 09:58:11 -0800129 kRpDisplayName,
Yicheng Li4d27fa72020-12-10 11:09:21 -0800130 kUserId,
131 kUserDisplayName,
Yicheng Lid73908d2021-02-17 09:58:11 -0800132 kCreatedTime,
133 /* is_resident_key = */ true};
Yicheng Li4d27fa72020-12-10 11:09:21 -0800134
135 EXPECT_TRUE(webauthn_storage_->WriteRecord(record));
136 }
137
138 webauthn_storage_->Reset();
139 webauthn_storage_->set_allow_access(true);
140 webauthn_storage_->set_sanitized_user(kSanitizedUser);
141
142 EXPECT_TRUE(webauthn_storage_->LoadRecords());
143}
144
Yicheng Li1090c902020-11-10 11:31:43 -0800145} // namespace
146} // namespace u2f