blob: 762d32e445dd3e97993e01f553bc1f541c67f99c [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 "libhwsec/backend/tpm2/random.h"
#include <string>
#include <base/functional/callback_helpers.h>
#include <base/strings/stringprintf.h>
#include <libhwsec-foundation/status/status_chain_macros.h>
#include <trunks/openssl_utility.h>
#include <trunks/tpm_utility.h>
#include "libhwsec/error/tpm2_error.h"
#include "libhwsec/status.h"
using brillo::BlobFromString;
using hwsec_foundation::status::MakeStatus;
namespace hwsec {
StatusOr<brillo::Blob> RandomTpm2::RandomBlob(size_t size) {
ASSIGN_OR_RETURN(const brillo::SecureBlob& blob, RandomSecureBlob(size),
_.WithStatus<TPMError>("Failed to get random secure data"));
return brillo::Blob(blob.begin(), blob.end());
}
StatusOr<brillo::SecureBlob> RandomTpm2::RandomSecureBlob(size_t size) {
std::string random_data;
// Cleanup the data for secure blob.
base::ScopedClosureRunner cleanup_random_data(base::BindOnce(
brillo::SecureClearContainer<std::string>, std::ref(random_data)));
RETURN_IF_ERROR(MakeStatus<TPM2Error>(context_.GetTpmUtility().GenerateRandom(
size, /*delegate=*/nullptr, &random_data)))
.WithStatus<TPMError>("Failed to get random data");
if (random_data.size() != size) {
return MakeStatus<TPMError>(
base::StringPrintf(
"Failed to get random data: requested size %zu, received size %zu",
size, random_data.size()),
TPMRetryAction::kNoRetry);
}
return brillo::SecureBlob(random_data.begin(), random_data.end());
}
} // namespace hwsec