blob: 055e1c152924535383c666df2bf276a2aa9e5eba [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync/test/fake_cryptographer.h"
#include "base/containers/contains.h"
#include "base/ranges/algorithm.h"
#include "base/strings/strcat.h"
#include "base/strings/string_util.h"
namespace syncer {
namespace {
const char kSeparator[] = "@@";
} // namespace
// static
std::unique_ptr<FakeCryptographer> FakeCryptographer::FromSingleDefaultKey(
const std::string& key_name) {
auto cryptographer = std::make_unique<FakeCryptographer>();
cryptographer->AddEncryptionKey(key_name);
cryptographer->SelectDefaultEncryptionKey(key_name);
return cryptographer;
}
FakeCryptographer::FakeCryptographer() = default;
FakeCryptographer::~FakeCryptographer() = default;
void FakeCryptographer::AddEncryptionKey(const std::string& key_name) {
DCHECK(!key_name.empty());
known_key_names_.insert(key_name);
}
void FakeCryptographer::SelectDefaultEncryptionKey(
const std::string& key_name) {
DCHECK(base::Contains(known_key_names_, key_name));
default_key_name_ = key_name;
}
void FakeCryptographer::ClearDefaultEncryptionKey() {
default_key_name_.clear();
}
bool FakeCryptographer::CanEncrypt() const {
return !default_key_name_.empty();
}
bool FakeCryptographer::CanDecrypt(
const sync_pb::EncryptedData& encrypted) const {
return base::Contains(known_key_names_, encrypted.key_name());
}
std::string FakeCryptographer::GetDefaultEncryptionKeyName() const {
return default_key_name_;
}
bool FakeCryptographer::EncryptString(const std::string& decrypted,
sync_pb::EncryptedData* encrypted) const {
if (default_key_name_.empty()) {
return false;
}
*encrypted->mutable_key_name() = default_key_name_;
*encrypted->mutable_blob() =
base::StrCat({default_key_name_, kSeparator, decrypted});
return true;
}
bool FakeCryptographer::DecryptToString(const sync_pb::EncryptedData& encrypted,
std::string* decrypted) const {
auto key_iter = base::ranges::find(known_key_names_, encrypted.key_name());
if (key_iter == known_key_names_.end()) {
return false;
}
std::string key_name_and_separator = base::StrCat({*key_iter, kSeparator});
if (!base::StartsWith(encrypted.blob(), key_name_and_separator)) {
// Corrupted blob.
return false;
}
*decrypted =
std::string(encrypted.blob().begin() + key_name_and_separator.size(),
encrypted.blob().end());
return true;
}
} // namespace syncer