1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_TRUSTED_VAULT_RECOVERY_KEY_STORE_CONNECTION_H_
#define COMPONENTS_TRUSTED_VAULT_RECOVERY_KEY_STORE_CONNECTION_H_
#include <memory>
#include "base/functional/callback.h"
#include "base/types/expected.h"
#include "components/trusted_vault/proto/recovery_key_store.pb.h"
#include "components/trusted_vault/recovery_key_store_certificate.h"
#include "components/trusted_vault/trusted_vault_connection.h"
struct CoreAccountInfo;
namespace base {
class Clock;
} // namespace base
namespace trusted_vault {
enum class RecoveryKeyStoreStatus {
kSuccess,
kTransientAccessTokenFetchError,
kPersistentAccessTokenFetchError,
kPrimaryAccountChangeAccessTokenFetchError,
kNetworkError,
kOtherError,
};
enum class RecoveryKeyStoreCertificateFetchStatus {
// Fetching and parsing the certificates succeeded.
kSuccess,
// An error occurred when downloading either of the XML files.
kNetworkError,
// The files were downloaded successfully, but failed to parse, e.g. because a
// certificate chain could not be built.
kParseError,
};
// This is the subset of information from the recovery key store that Chrome
// uses.
struct RecoveryKeyStoreEntry {
RecoveryKeyStoreEntry();
RecoveryKeyStoreEntry(RecoveryKeyStoreEntry&&);
RecoveryKeyStoreEntry& operator=(RecoveryKeyStoreEntry&&);
~RecoveryKeyStoreEntry();
bool operator==(const RecoveryKeyStoreEntry&) const;
// The identifier for the vault.
std::vector<uint8_t> vault_handle;
// The backend cohort public key.
std::vector<uint8_t> backend_public_key;
};
// RecoveryKeyStoreConnection supports interaction with the recovery key store
// service (internally named Vault).
class RecoveryKeyStoreConnection {
public:
using Request = TrustedVaultConnection::Request;
using UpdateRecoveryKeyStoreCallback =
base::OnceCallback<void(RecoveryKeyStoreStatus)>;
using ListRecoveryKeyStoresCallback =
base::OnceCallback<void(base::expected<std::vector<RecoveryKeyStoreEntry>,
RecoveryKeyStoreStatus>)>;
using FetchRecoveryKeyStoreCertificatesCallback = base::OnceCallback<void(
base::expected<RecoveryKeyStoreCertificate,
RecoveryKeyStoreCertificateFetchStatus>)>;
RecoveryKeyStoreConnection() = default;
RecoveryKeyStoreConnection(const RecoveryKeyStoreConnection& other) = delete;
RecoveryKeyStoreConnection& operator=(
const RecoveryKeyStoreConnection& other) = delete;
virtual ~RecoveryKeyStoreConnection() = default;
// Updates the recovery key store for a (user, device) pair. `request`
// contains an identifier for the particular recovery key store to update.
virtual std::unique_ptr<Request> UpdateRecoveryKeyStore(
const CoreAccountInfo& account_info,
const trusted_vault_pb::Vault& request,
UpdateRecoveryKeyStoreCallback callback) = 0;
// Lists the recovery key stores for a user.
virtual std::unique_ptr<Request> ListRecoveryKeyStores(
const CoreAccountInfo& account_info,
ListRecoveryKeyStoresCallback callback) = 0;
// Fetches and parses the recovery key store certificates, i.e. cert.xml and
// cert.sig.xml files.
// Certificates are validated against the current time, hence tests should
// pass a fake |clock| so certificate validation does not break in the future.
virtual std::unique_ptr<Request> FetchRecoveryKeyStoreCertificates(
base::Clock* clock,
FetchRecoveryKeyStoreCertificatesCallback callback) = 0;
};
} // namespace trusted_vault
#endif // COMPONENTS_TRUSTED_VAULT_RECOVERY_KEY_STORE_CONNECTION_H_
|