blob: 0fa53da7f3f15af1dd7ccad77a9861d625461def [file] [log] [blame] [edit]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cryptohome/auth_factor/map.h"
#include <optional>
#include <string>
#include <utility>
#include "cryptohome/auth_factor/auth_factor.h"
#include "cryptohome/auth_factor/storage_type.h"
#include "cryptohome/cryptohome_metrics.h"
namespace cryptohome {
void AuthFactorMap::Add(AuthFactor auth_factor,
AuthFactorStorageType storage_type) {
std::string label = auth_factor.label();
storage_.insert_or_assign(
std::move(label), StoredAuthFactor{.auth_factor = std::move(auth_factor),
.storage_type = storage_type});
}
void AuthFactorMap::Remove(const std::string& label) {
storage_.erase(label);
}
bool AuthFactorMap::HasFactorWithStorage(
AuthFactorStorageType storage_type) const {
for (const auto& [unused, value] : storage_) {
if (value.storage_type == storage_type) {
return true;
}
}
return false;
}
std::optional<AuthFactorMap::ValueView> AuthFactorMap::Find(
const std::string& label) const {
auto iter = storage_.find(label);
if (iter == storage_.end()) {
return std::nullopt;
}
return ValueView(&iter->second);
}
void AuthFactorMap::ReportAuthFactorBackingStoreMetrics() const {
bool using_vk = false, using_uss = false;
for (const auto& [unused, stored_auth_factor] : storage_) {
switch (stored_auth_factor.storage_type) {
case AuthFactorStorageType::kVaultKeyset:
using_vk = true;
break;
case AuthFactorStorageType::kUserSecretStash:
using_uss = true;
break;
}
}
if (using_vk && using_uss) {
ReportAuthFactorBackingStoreConfig(AuthFactorBackingStoreConfig::kMixed);
} else if (using_uss) {
ReportAuthFactorBackingStoreConfig(
AuthFactorBackingStoreConfig::kUserSecretStash);
} else if (using_vk) {
ReportAuthFactorBackingStoreConfig(
AuthFactorBackingStoreConfig::kVaultKeyset);
} else {
ReportAuthFactorBackingStoreConfig(AuthFactorBackingStoreConfig::kEmpty);
}
}
} // namespace cryptohome