blob: 05036c57d0604076035904d442600875b7a59bb2 [file] [log] [blame]
// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "vtpm/backends/disk_cache_blob.h"
#include <fcntl.h>
#include <string>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/files/important_file_writer.h>
#include <base/logging.h>
#include <trunks/tpm_generated.h>
#include "vtpm/backends/database.pb.h"
namespace vtpm {
DiskCacheBlob::DiskCacheBlob(const base::FilePath& path) : path_(path) {}
trunks::TPM_RC DiskCacheBlob::Get(std::string& blob) {
if (!base::PathExists(path_)) {
return trunks::TPM_RC_SUCCESS;
}
std::string buffer;
if (!base::ReadFileToString(path_, &buffer)) {
return trunks::TPM_RC_FAILURE;
}
BlobData data;
if (!data.ParseFromString(buffer)) {
return trunks::TPM_RC_FAILURE;
}
blob = data.blob();
return trunks::TPM_RC_SUCCESS;
}
trunks::TPM_RC DiskCacheBlob::Write(const std::string& blob) {
BlobData data;
data.set_blob(blob);
std::string buffer;
if (!data.SerializeToString(&buffer)) {
return trunks::TPM_RC_FAILURE;
}
// Note that it is assumed that the directory of `path_` exists.
if (!base::ImportantFileWriter::WriteFileAtomically(path_, buffer)) {
LOG(ERROR) << __func__ << "Failed to write file: " << path_.value();
return trunks::TPM_RC_FAILURE;
}
return trunks::TPM_RC_SUCCESS;
}
} // namespace vtpm