blob: 479a6f00fbd664491f62b1bb75c6b076235cda2c [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/session_management.h"
#include <functional>
#include <memory>
#include <utility>
#include <absl/container/flat_hash_map.h>
#include <libhwsec-foundation/status/status_chain_macros.h>
#include <trunks/hmac_session.h>
#include <trunks/tpm_utility.h>
#include <trunks/trunks_factory.h>
#include "libhwsec/error/tpm2_error.h"
#include "libhwsec/status.h"
using brillo::BlobFromString;
using brillo::BlobToString;
using hwsec_foundation::status::MakeStatus;
namespace hwsec {
Status SessionManagementTpm2::FlushInvalidSessions() {
if (hmac_sessions_.empty()) {
return MakeStatus<TPMError>("Nothing to flush", TPMRetryAction::kNoRetry);
}
// Clear all HMAC sessions.
hmac_sessions_.clear();
return OkStatus();
}
StatusOr<std::reference_wrapper<trunks::HmacSession>>
SessionManagementTpm2::GetOrCreateHmacSession(SessionSecuritySetting setting) {
auto [iter, new_insert] = hmac_sessions_.insert({setting, nullptr});
if (!new_insert && iter->second != nullptr) {
// The session already exists.
// Reset the entity authorization value.
iter->second->SetEntityAuthorizationValue("");
return *iter->second;
}
std::unique_ptr<trunks::HmacSession>& hmac_session = iter->second;
hmac_session = context_.GetTrunksFactory().GetHmacSession();
SessionSecurityDetail detail = ToSessionSecurityDetail(setting);
RETURN_IF_ERROR(MakeStatus<TPM2Error>(hmac_session->StartUnboundSession(
detail.salted, detail.enable_encryption)))
.WithStatus<TPMError>("Failed to start hmac session");
hmac_session->SetEntityAuthorizationValue("");
return *hmac_session;
}
} // namespace hwsec