blob: 287182710dd91636c2ece82318486047960f151d [file] [log] [blame]
// Copyright 2023 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/flatbuffer_file.h"
#include <sys/stat.h>
#include <optional>
#include <string>
#include <base/files/file_path.h>
#include <base/logging.h>
#include <brillo/secure_blob.h>
#include "cryptohome/error/location_utils.h"
#include "cryptohome/filesystem_layout.h"
#include "cryptohome/platform.h"
namespace cryptohome {
namespace {
using ::cryptohome::error::CryptohomeError;
using ::cryptohome::error::ErrorActionSet;
using ::cryptohome::error::PossibleAction;
using ::cryptohome::error::PrimaryAction;
using ::hwsec_foundation::status::MakeStatus;
using ::hwsec_foundation::status::OkStatus;
using ::hwsec_foundation::status::StatusChain;
constexpr mode_t kOwnerReadWritePermissions = 0600;
} // namespace
FlatbufferFile::FlatbufferFile(Platform* platform, const base::FilePath& path)
: platform_(platform), path_(path) {}
FlatbufferFile::~FlatbufferFile() = default;
CryptohomeStatus FlatbufferFile::StoreFile(const brillo::Blob& buffer,
const TimerType& timer_type) const {
ReportTimerStart(timer_type);
bool write_success = platform_->WriteFileAtomicDurable(
path_, buffer, kOwnerReadWritePermissions);
ReportTimerStop(timer_type);
if (!write_success) {
LOG(ERROR) << "Failed to store the file: " << path_.value();
return MakeStatus<CryptohomeError>(
CRYPTOHOME_ERR_LOC(kLocStoreFileFailedInFlatbufferFile),
ErrorActionSet({PossibleAction::kReboot,
PossibleAction::kDevCheckUnexpectedState}),
user_data_auth::CRYPTOHOME_ERROR_BACKING_STORE_FAILURE);
}
return OkStatus<CryptohomeError>();
}
CryptohomeStatusOr<brillo::Blob> FlatbufferFile::LoadFile(
const TimerType& timer_type) const {
brillo::Blob buffer;
ReportTimerStart(timer_type);
bool read_success = platform_->ReadFile(path_, &buffer);
ReportTimerStop(timer_type);
if (!read_success) {
return MakeStatus<CryptohomeError>(
CRYPTOHOME_ERR_LOC(kLocLoadFileFailedInFlatbufferFile),
ErrorActionSet({PossibleAction::kReboot, PossibleAction::kDeleteVault,
PossibleAction::kAuth,
PossibleAction::kDevCheckUnexpectedState}),
user_data_auth::CRYPTOHOME_ERROR_BACKING_STORE_FAILURE);
}
return buffer;
}
} // namespace cryptohome